diff -r 000000000000 -r a4daefaec16c voipplugins/accountcreationplugin/engine/src/acpcontroller.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/voipplugins/accountcreationplugin/engine/src/acpcontroller.cpp Mon Jan 18 20:12:36 2010 +0200 @@ -0,0 +1,1080 @@ +/* +* 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: Implements CAcpController methods +* +*/ + +#include +#include +#include +#include +#include // For getting phone memory boot path. +#include // For getting phone memory boot path. +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "acpprovider.h" +#include "acpcontroller.h" +#include "acpxmlhandler.h" +#include "acphttphandler.h" +#include "accountcreationpluginlogger.h" +#include "macpcontrollerobserver.h" +#include "acpbrowserparams.h" +#include "acpimagehandler.h" +#include "acpprivatecrkeys.h" + +// --------------------------------------------------------------------------- +// CAcpController::CAcpController +// --------------------------------------------------------------------------- +// +CAcpController::CAcpController( MAcpControllerObserver& aObserver ) + : iObserver( aObserver ), + iActiveIndex( KErrNone ), + iSisInstallation( EFalse ) + { + } + +// --------------------------------------------------------------------------- +// CAcpController::ConstructL +// --------------------------------------------------------------------------- +// +void CAcpController::ConstructL() + { + ACPLOG( "CAcpController::ConstructL begin" ); + + iParser = CAcpXmlHandler::NewL( *this ); + iHttpHandler = CAcpHttpHandler::NewL( *this ); + iData = HBufC8::NewL( KBufferSize ); + iImageHandler = CAcpImageHandler::NewL( *this ); + User::LeaveIfError( iFs.Connect() ); + iSessionId = HBufC8::NewL( 0 ); + + ACPLOG( "CAcpController::ConstructL end" ); + } + +// --------------------------------------------------------------------------- +// CAcpController::NewL +// --------------------------------------------------------------------------- +// +EXPORT_C CAcpController* CAcpController::NewL( + MAcpControllerObserver& aObserver ) + { + CAcpController* self = CAcpController::NewLC( aObserver ); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// CAcpController::NewLC +// --------------------------------------------------------------------------- +// +EXPORT_C CAcpController* CAcpController::NewLC( + MAcpControllerObserver& aObserver ) + { + CAcpController* self = new ( ELeave ) CAcpController( aObserver ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + + +// --------------------------------------------------------------------------- +// CAcpController::~CAcpController +// --------------------------------------------------------------------------- +// +CAcpController::~CAcpController() + { + ACPLOG( "CAcpController::~CAcpController begin" ); + + iFs.Close(); + iProviders.ResetAndDestroy(); + delete iParser; + delete iHttpHandler; + delete iData; + +#ifdef __PLUG_AND_PLAY_MOBILE_SERVICES + delete iPnpmsparams; +#endif + + delete iImageHandler; + delete iSessionId; + delete iSipModel; + + ACPLOG( "CAcpController::~CAcpController end" ); + } + +// --------------------------------------------------------------------------- +// CAcpController::FetchProviderListFromNetworkL +// Fetches provider list from network and parses it. +// --------------------------------------------------------------------------- +// +EXPORT_C void CAcpController::FetchProviderListFromNetworkL() + { + ACPLOG( "CAcpController::FetchProviderListFromNetworkL begin" ); + + // Create SIP profile registry. From now on we'll get SIP events. + iSipModel = CSIPManagedProfileRegistry::NewL( *this ); + + // Delete old data, otherwise Refresh won't work. + delete iData; + iData = NULL; + iData = HBufC8::NewL( KBufferSize ); + iFilename.Zero(); + iProviders.ResetAndDestroy(); + + // 'Restart' XML parser. + delete iParser; + iParser = NULL; + iParser = CAcpXmlHandler::NewL( *this ); + + // Get server URL from CenRep. + HBufC* url = HBufC::NewLC( KNameMaxLength * 2 ); + CRepository* cenrep = CRepository::NewLC( KAccountCreationSettingsUid ); + + TPtr urlPtr( url->Des() ); + cenrep->Get( KAccountCreationPluginServerUri, urlPtr ); + + CleanupStack::PopAndDestroy( cenrep ); + + // Descriptor for body data. + TBuf8 postData8; + + // Get the download parameters. + FetchParametersL( urlPtr ); + + // Convert unicode descriptor into UTF8. + HBufC8 *url8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L( *url ); + CleanupStack::PushL( url8 ); + + // Start dowloading provider list from network. + iHttpHandler->GetDataL( *url8, KXmlMimeType, postData8, EFalse, + KNullDesC8 ); + + CleanupStack::PopAndDestroy( 2, url ); // url8, url + + // Set request type for the http observer because of downloading XML + // file from network. + // From now on, response events comes to NotifyHttpEvent, NotifyHttpError, + // NotifyBodyReceived and NotifyContentTypeReceived. + iType = EXml; + + // Reset active index. + SaveActiveIndex( 0 ); + + ACPLOG( "CAcpController::FetchProviderListFromNetworkL end" ); + } + +// --------------------------------------------------------------------------- +// CAcpController::FetchSisFileFromNetworkL +// Fetches provider list from network and parses it. +// --------------------------------------------------------------------------- +// +EXPORT_C void CAcpController::FetchSisFileFromNetworkL( TDesC8& aSisUrl ) + { + ACPLOG( "CAcpController::FetchSisFileFromNetworkL begin" ); + + // Delete old data. + delete iData; + iData = NULL; + iData = HBufC8::NewL( KBufferSize ); + + // Descriptor for body data. + TBuf8 postData8; + + iFs.Delete( KSisFile ); // Old file should delete at first. + iWs.Create( iFs , KSisFile, EFileWrite );// Create the file as requested. + iFilename.Copy( KSisFile ); + + // Start downloading sis file from network. Use saved session id. + iHttpHandler->GetDataL( aSisUrl, KSisMimeType, postData8, EFalse, + *iSessionId, ETrue ); + + // Set request type for the HTTP observer because of downloading SIS file + // from network. + // From now on, response events comes to NotifyHttpEvent, NotifyHttpError, + // NotifyBodyReceived and NotifyContentTypeReceived. + iType = ESis; + + // Reset error flag. + iErrorDownloading = EFalse; + + ACPLOG( "CAcpController::FetchSisFileFromNetworkL end" ); + } + +// --------------------------------------------------------------------------- +// CAcpController::FetchIconFileFromNetworkL +// Fetches provider list from network and parses it. +// --------------------------------------------------------------------------- +// +EXPORT_C void CAcpController::FetchIconFileFromNetworkL( TDesC8& aIconUrl ) + { + ACPLOG( "CAcpController::FetchIconFileFromNetworkL begin" ); + ACPLOG2( " - fetching: %S", &aIconUrl ); + + if ( aIconUrl.Length() ) + { + // Descriptor for downloading icon file. + TBuf url; + + // Copy the icon address into the descriptor with default size (256). + url.Copy( aIconUrl.Right( KDefaultBufferSize ) ); + + // Descriptor for body data. + TBuf8 postData8; + + // Use saved session id when fetching icons. + iHttpHandler->GetDataL( aIconUrl, KIconMimeType, postData8, ETrue, + *iSessionId ); + + // Set request type for the HTTP observer because of downloading icon + // file from network. + // From now on, response events comes to NotifyHttpEvent, + // NotifyHttpError, NotifyBodyReceived and NotifyContentTypeReceived. + iType = EIcon; + } + + ACPLOG( "CAcpController::FetchIconFileFromNetworkL end" ); + } + +// --------------------------------------------------------------------------- +// CAcpController::CountOfProviders +// Returns count of providers in providers array. +// --------------------------------------------------------------------------- +// +EXPORT_C TInt CAcpController::CountOfProviders() const + { + TInt count = iProviders.Count(); + ACPLOG2( "CAcpController::CountOfProviders: count=%d", count ); + return count; + } + +// --------------------------------------------------------------------------- +// CAcpController::ProviderNameFromIndexL +// Returns pointer to provider name by index. +// --------------------------------------------------------------------------- +// +EXPORT_C const TPtrC CAcpController::ProviderNameFromIndexL( + TInt aIndex ) const + { + if ( 0 > aIndex || aIndex >= iProviders.Count() ) + { + User::Leave( KErrArgument ); + } + CAcpProvider& provider = *iProviders[aIndex]; + return provider.ProviderName(); + } + +// --------------------------------------------------------------------------- +// CAcpController::ProviderSisUrlFromIndexL +// Returns pointer to provider sisurl by index. +// --------------------------------------------------------------------------- +// +EXPORT_C const TPtrC8 CAcpController::ProviderSisUrlFromIndexL( + TInt aIndex ) const + { + if ( 0 > aIndex || aIndex >= iProviders.Count() ) + { + User::Leave( KErrArgument ); + } + CAcpProvider& provider = *iProviders[aIndex]; + return provider.SisUrl(); + } + +// --------------------------------------------------------------------------- +// CAcpController::ProviderActivateUrlFromIndexL +// Returns pointer to provider sisurl by index. +// --------------------------------------------------------------------------- +// +EXPORT_C const TPtrC8 CAcpController::ProviderActivationUrlFromIndexL( + TInt aIndex ) const + { + if ( 0 > aIndex || aIndex >= iProviders.Count() ) + { + User::Leave( KErrArgument ); + } + CAcpProvider& provider = *iProviders[aIndex]; + return provider.ActivationUrl(); + } + +// --------------------------------------------------------------------------- +// CAcpController::ProviderCreateUrlFromIndexL +// Returns pointer to provider sisurl by index. +// --------------------------------------------------------------------------- +// +EXPORT_C const TPtrC8 CAcpController::ProviderCreationUrlFromIndexL( + TInt aIndex ) const + { + if ( 0 > aIndex || aIndex >= iProviders.Count() ) + { + User::Leave( KErrArgument ); + } + CAcpProvider& provider = *iProviders[aIndex]; + return provider.CreationUrl(); + } + +// --------------------------------------------------------------------------- +// CAcpController::ProviderDescriptionFromIndexL +// Returns pointer to provider description by index. +// --------------------------------------------------------------------------- +// +EXPORT_C const TPtrC CAcpController::ProviderDescriptionFromIndexL( + TInt aIndex ) const + { + if ( 0 > aIndex || aIndex >= iProviders.Count() ) + { + User::Leave( KErrArgument ); + } + CAcpProvider& provider = *iProviders[aIndex]; + return provider.ProviderDescription(); + } + +// --------------------------------------------------------------------------- +// CAcpController::ProviderTypeFromIndexL +// Returns pointer to provider Type by index. +// --------------------------------------------------------------------------- +// +EXPORT_C const TPtrC CAcpController::ProviderTypeFromIndexL( + TInt aIndex ) const + { + if ( 0 > aIndex || aIndex >= iProviders.Count() ) + { + User::Leave( KErrArgument ); + } + CAcpProvider& provider = *iProviders[aIndex]; + return provider.ProviderType(); + } + +// --------------------------------------------------------------------------- +// CAcpController::ProviderIconUrlFromIndexL +// Returns pointer to provider Type by index. +// --------------------------------------------------------------------------- +// +EXPORT_C const TPtrC8 CAcpController::ProviderIconUrlFromIndexL( + TInt aIndex ) const + { + if ( 0 > aIndex || aIndex >= iProviders.Count() ) + { + User::Leave( KErrArgument ); + } + + CAcpProvider& provider = *iProviders[aIndex]; + return provider.IconUrl(); + } + +// --------------------------------------------------------------------------- +// CAcpController::SaveActiveIndex +// Stores active list index in provider list view to member data. +// --------------------------------------------------------------------------- +// +EXPORT_C void CAcpController::SaveActiveIndex( TInt aIndex ) + { + iActiveIndex = aIndex; + } + +// --------------------------------------------------------------------------- +// CAcpController::ActiveIndex +// Returns active list index from member data. +// --------------------------------------------------------------------------- +// +EXPORT_C TInt CAcpController::ActiveIndex() const + { + return iActiveIndex; + } + +// --------------------------------------------------------------------------- +// CAcpController::FetchParametersL +// --------------------------------------------------------------------------- +// +EXPORT_C void CAcpController::FetchParametersL( TDes& aUrl ) + { + ACPLOG( "CAcpController::FetchParametersL begin" ); + +#ifdef __PLUG_AND_PLAY_MOBILE_SERVICES + if ( !iPnpmsparams ) + { + iPnpmsparams = CACPBrowserParams::NewL(); + } + + // This is going to append detail data after the requested address because + // of downloading data from network later on. + iPnpmsparams->GetParameters( aUrl ); +#endif + + ACPLOG( "CAcpController::FetchParametersL end" ); + } + +// --------------------------------------------------------------------------- +// CAcpController::CancelHttpRequest +// Cancels ongoing HTTP request (transaction). +// --------------------------------------------------------------------------- +// +EXPORT_C void CAcpController::CancelHttpRequest() + { + ACPLOG( "CAcpController::CancelHttpRequest begin" ); + + iWs.Close(); + if ( iHttpHandler ) + { + iHttpHandler->CancelTransaction(); + } + + ACPLOG( "CAcpController::CancelHttpRequest end" ); + } + +// --------------------------------------------------------------------------- +// CAcpController::FetchActionFileL +// Starts downloading action (wbxml) file from the server. +// --------------------------------------------------------------------------- +// +EXPORT_C void CAcpController::FetchActionFileL( const TDesC8& aUrl ) + { + ACPLOG( "CAcpController::FetchActionFileL begin" ); + + if ( !aUrl.Length() ) + { + User::Leave( KErrArgument ); + } + + delete iData; + iData = NULL; + iData = HBufC8::NewL( KBufferSize ); + + iType = EAction; + iHttpHandler->GetDataL( aUrl, KActionMimeType, *iData, EFalse, + *iSessionId ); + + // Reset error flag. + iErrorDownloading = EFalse; + + ACPLOG( "CAcpController::FetchActionFileL end" ); + } + +// --------------------------------------------------------------------------- +// CAcpController::SessionId +// Returns session id received from the server. +// --------------------------------------------------------------------------- +// +EXPORT_C const TDesC8& CAcpController::SessionId() + { + return *iSessionId; + } + +// --------------------------------------------------------------------------- +// CAcpController::ProviderBitmapFromIndexL +// Returns pointer to provider icon by index. +// --------------------------------------------------------------------------- +// +EXPORT_C void CAcpController::ProviderBitmapsFromIndexL( + TInt aIndex, CFbsBitmap*& aBitmap, CFbsBitmap*& aMask ) const + { + ACPLOG2( "CAcpController::ProviderBitmapsFromIndexL (%d)", aIndex ); + + // Check whether the index in range or not. + if ( aIndex < 0 || aIndex >= iProviders.Count() ) + { + // Not in range next leaves with error + User::Leave( KErrArgument ); + } + + // Get provider. + CAcpProvider& provider = *iProviders[aIndex]; + + // Set bitmaps. + provider.GetBitmaps( aBitmap, aMask ); + + ACPLOG( "CAcpController::ProviderBitmapsFromIndexL out" ); + } + +// --------------------------------------------------------------------------- +// CAcpController::CreateFileFromDataL +// Creates file from data. +// --------------------------------------------------------------------------- +// +void CAcpController::CreateFileFromDataL( const TDesC& aFilename ) + { + ACPLOG2( "CAcpController::CreateFileFromDataL file=%S", &aFilename ); + + RFileWriteStream ws; // Create stream for writing data into the file + CleanupClosePushL( ws ); + + iFs.Delete( aFilename ); // Old file should delete at first. + ws.Create( iFs , aFilename, EFileWrite );// Create the file as requested. + ws.WriteL( iData->Des() );// Write requested data into the file. + ws.CommitL(); // Ensure that the stream is not contain data anymore. + CleanupStack::PopAndDestroy( &ws ); + + // Delete content of the descriptor so it's ready to receive data again + // from network. + TPtr8 dataPtr( iData->Des() ); + dataPtr.Delete( 0, iData->Length() ); + } + +// --------------------------------------------------------------------------- +// CAcpController::HandleActionFileL +// Parses the received action file for wbxml content and sends it to +// provisioning engine. +// --------------------------------------------------------------------------- +// +void CAcpController::HandleActionFileL() + { + ACPLOG( "CAcpController::HandleActionFileL begin" ); + + if ( !iData || !iData->Length() ) + { + User::Leave( KErrArgument ); + } + + // These values are from PnPMS documentation. + const TInt KContentTypeLenPos = 5; + const TInt KSkippableBytes = 6; + + // Parse content from the wrapper. + TUint32 headersLen( 0 ); + TUint32 contentLen( 0 ); + TUint8 contentTypeLen( (*iData)[KContentTypeLenPos] ); + + TPtrC8 decodeBuf( iData->Ptr() + KSkippableBytes + contentTypeLen ); + TWspPrimitiveDecoder decoder( decodeBuf ); + User::LeaveIfError( decoder.UintVar( headersLen ) ); + ACPLOG2( " - headers length: %d", headersLen ); + + User::LeaveIfError( decoder.UintVar( contentLen ) ); + ACPLOG2( " - content length: %d", contentLen ); + if ( !contentLen || !headersLen ) + { + User::Leave( KErrCorrupt ); + } + + // Get data and header pointers. + const TInt dataOffset( iData->Length() - contentLen ); + const TUint8* dataPtr( iData->Ptr() + dataOffset ); + const TInt headerOffset( iData->Length() - contentLen - headersLen ); + const TUint8* headerPtr( iData->Ptr() + headerOffset ); + + TPtrC8 wbxmlPtr( dataPtr, contentLen ); // Pointer to wbxml data. + TPtrC8 hdrPtr( headerPtr, headersLen ); // Pointer to headers. + + // Validate data with PnPUtil. + CPnpUtilImpl* pnpUtil = CPnpUtilImpl::NewLC(); + + HBufC8* nonce = HBufC8::NewLC( KNonceLength ); + TPtr8 noncePtr( nonce->Des() ); + pnpUtil->GetNonceL( noncePtr ); + + _LIT8( KSignatureValue, "SignValue:" ); + _LIT8( KDigestValue, "DigValue:" ); + + TPtrC8 digestEnc( GetHeaderParamL( hdrPtr, KDigestValue ) ); + TPtrC8 signatureEnc( GetHeaderParamL( hdrPtr, KSignatureValue ) ); + + if ( pnpUtil->VerifySignatureL( + digestEnc, signatureEnc, wbxmlPtr, *nonce ) ) + { + ACPLOG( " - signature verified" ); + } + else + { + ACPLOG( " - cannot verify signature" ); + User::Leave( KErrCorrupt ); + } + + CleanupStack::PopAndDestroy( 2, pnpUtil ); + + // Import the OMA CP message. + CWPEngine* provEngine = CWPEngine::NewLC(); + provEngine->ImportDocumentL( wbxmlPtr ); + + // Populate OMA message to adapters. + provEngine->PopulateL(); + + // Save OMA message. + const TInt itemCount = provEngine->ItemCount(); + for ( TInt counter = 0; counter < itemCount; counter++ ) + { + provEngine->SaveL( counter ); + } + + CleanupStack::PopAndDestroy( provEngine ); + + iObserver.NotifyProvisioningCompleted(); + + ACPLOG( "CAcpController::HandleActionFileL end" ); + } + +// --------------------------------------------------------------------------- +// CAcpController::NextIndexWithIconUrl +// Returns next index with an icon URL in the providers list. +// --------------------------------------------------------------------------- +// +TInt CAcpController::NextIndexWithIconUrl( TPtrC8& aResultUrl ) + { + ACPLOG( "CAcpController::NextIndexWithIconUrl begin" ); + + TInt ret( KErrNotFound ); + + const TInt startIndex( iActiveIndex ); + for ( TInt i = startIndex; i < iProviders.Count(); i++ ) + { + TPtrC8 iconUrl; + TRAPD( error, iconUrl.Set( ProviderIconUrlFromIndexL( i ) ) ); + if ( KErrNone == error && iconUrl.Length() ) + { + SaveActiveIndex( i ); + aResultUrl.Set( iconUrl ); + ret = i; + break; + } + } + + ACPLOG2( "CAcpController::NextIndexWithIconUrl end (%d)", ret ); + return ret; + } + +// --------------------------------------------------------------------------- +// CAcpController::GetHeaderParamL +// Parses a specific header value from head wrapper format. +// --------------------------------------------------------------------------- +// +TPtrC8 CAcpController::GetHeaderParamL( const TDesC8& aHeaders, + const TDesC8& aParam ) + { + ACPLOG( "CAcpController::GetHeaderParamL begin" ); + + if ( !aHeaders.Length() || !aParam.Length() ) + { + User::Leave( KErrArgument ); + } + + TInt paramLoc = aHeaders.Find( aParam ); + + if ( KErrNotFound == paramLoc ) + { + ACPLOG( " - error: Given parameter not found in headers" ); + User::Leave( KErrNotFound ); + } + else + { + paramLoc = paramLoc + aParam.Length(); + } + + TPtrC8 paramToEndPtr( aHeaders.Mid( paramLoc ) ); + TInt paramLen = paramToEndPtr.Locate( '\n' ); + if ( KErrNotFound == paramLen ) + { + paramLen = aHeaders.Length() - paramLoc; + } + ACPLOG2( " - parameter length: %d", paramLen ); + + TPtrC8 param( aHeaders.Ptr() + paramLoc, paramLen ); + + ACPLOG( "CAcpController::GetHeaderParamL end" ); + return param; + } + +// --------------------------------------------------------------------------- +// CAcpController::NotifyParsingCompleted +// From MAcpXmlHandlerObserver. +// --------------------------------------------------------------------------- +// +void CAcpController::NotifyParsingCompleted( TInt aError ) + { + ACPLOG( "CAcpController::NotifyParsingCompleted begin" ); + + iFs.Delete( iFilename ); + + // Forward error code to the observer and return. + if ( KErrNone != aError ) + { + iObserver.NotifyProviderListReady( aError ); + return; + } + + // Descriptor for downloading icon file from network. + SaveActiveIndex( 0 ); + TPtrC8 iconUrl; + TInt index = NextIndexWithIconUrl( iconUrl ); + + if ( KErrNotFound != index ) + { + // Provider with icon URL found, start downloading. + TRAP( aError, FetchIconFileFromNetworkL( iconUrl ) ); + if ( KErrNone != aError ) + { + iObserver.NotifyProviderListReady( aError ); + CancelHttpRequest(); + } + } + else + { + // None of the providers contains icons -> loading done. + iObserver.NotifyProviderListReady( KErrNone ); + CancelHttpRequest(); + } + + ACPLOG( "CAcpController::NotifyParsingCompleted end" ); + } + +// --------------------------------------------------------------------------- +// CAcpController::NotifyParsedProviderL +// From MAcpXmlHandlerObserver. +// --------------------------------------------------------------------------- +// +void CAcpController::NotifyParsedProviderL( const CAcpProvider& aProvider ) + { + // To save a data from the received provider then new instace of provider + // must be created at first. + CAcpProvider* provider = CAcpProvider::NewLC(); + provider->CopyL( aProvider ); + iProviders.Append( provider ); + CleanupStack::Pop( provider ); + + ACPLOG( "CAcpController::NotifyParsedProvider: New provider added!" ); + } + +// --------------------------------------------------------------------------- +// CAcpController::NotifyHttpError +// From MAcpHttpHandlerObserver. +// --------------------------------------------------------------------------- +// +void CAcpController::NotifyHttpError( TInt aError ) + { + ACPLOG2( "CAcpController::NotifyHttpError: Error occurred: %d", aError ); + iObserver.NotifyProviderListReady( aError ); + iWs.Close(); + // Set error flag if error occurred. + if ( aError ) + { + iErrorDownloading = ETrue; + } + } + +// --------------------------------------------------------------------------- +// CAcpController::NotifyHttpEvent +// From MAcpHttpHandlerObserver. +// --------------------------------------------------------------------------- +// +void CAcpController::NotifyHttpEvent( TInt aEvent ) + { + ACPLOG2( "CAcpController::NotifyHttpEvent begin (%d)", aEvent ); + + TInt error( KErrNone ); // For all operations + + switch ( aEvent ) + { + // To ignore the following + case THTTPEvent::EGotResponseHeaders: + break; + case THTTPEvent::EGotResponseBodyData: + break; + case THTTPEvent::EResponseComplete: + break; + // Request succeeded + case THTTPEvent::ESucceeded: + { + switch ( iType ) + { + // XML file for parsing the provider specific data. + case EXml: + { + // Xml data has arrived from server successfully. + + // First parse memory root path. + TParse parse; + parse.Set( PathInfo::PhoneMemoryRootPath(), NULL, NULL ); + TFileName xmlFile( parse.Drive() ); + // Then append file path to memory root. + xmlFile.Append( KXmlFile ); + iFilename.Copy( xmlFile ); + TRAP( error, CreateFileFromDataL( iFilename ) ); + + if ( KErrNone == error ) + { + TRAP( error, iParser->StartParsingL( iFilename ) ); + } + } + break; + // SIS file for installing the provider data on phone. + case ESis: + { + // SIS data has arrived from server successfully. + + // First parse memory root path. + TParse parse; + parse.Set( PathInfo::PhoneMemoryRootPath(), NULL, NULL ); + TFileName sisFile( parse.Drive() ); + // Then append file path to memory root. + sisFile.Append( KSisFile ); + iFilename.Copy( sisFile ); + + TRAP( error, iWs.CommitL() ); + iWs.Close(); + if ( KErrNone == error ) + { + // Set sis installation flag and notify + // sis downloading completed. + iSisInstallation = ETrue; + iObserver.NotifyDownloadingSISCompleted( iFilename ); + } + } + break; + // Icon file of the provider for displaying own icon on the + // provider list view. + case EIcon: + { + const TInt index = ActiveIndex(); + if ( index < iProviders.Count() && index >= 0 ) + { + CAcpProvider& provider = *iProviders[index]; + TPtrC8 mimeType = provider.ContentData(); + TRAP( error, iImageHandler->StartToDecodeL( + *iData, mimeType ) ); + } + } + break; + // Action file received successfully. + case EAction: + { + TRAP( error, HandleActionFileL() ); + ACPLOG2( " - HandleActionFileL error %d", error ); + iObserver.NotifyDownloadingCompleted( error ); + } + break; + } + } + break; + case THTTPEvent::EFailed: + { + ACPLOG( "CAcpController::NotifyHttpEvent:HTTP request failed!" ); + iWs.Close(); + iObserver.NotifyProviderListReady( KErrGeneral ); + + // Set error flag. + iErrorDownloading = ETrue; + } + break; + // Ignore all unspecified events. + default: + { + ACPLOG( "CAcpController::NotifyHttpEvent:Unknown HTTP request!" ); + } + break; + } + } + +// --------------------------------------------------------------------------- +// CAcpController::NotifyBodyReceived +// From MAcpHttpHandlerObserver. +// --------------------------------------------------------------------------- +// +void CAcpController::NotifyBodyReceived( const TDesC8& aBodyData ) + { + ACPLOG( "CAcpController::NotifyBodyReceived begin" ); + ACPLOG2( " - length of received data: %d", aBodyData.Length() ); + + // For SIS files we use RFileWriteStream for storing data. + if ( 0 == iFilename.Compare( KSisFile() ) ) + { + TRAP_IGNORE( iWs.WriteL( aBodyData ) ); + ACPLOG( "CAcpController::NotifyBodyReceived end" ); + return; + } + + // Data should exist before going to copy the data received from network. + if ( iData && aBodyData.Length() > 0 ) + { + TPtr8 dataPtr( iData->Des() ); + TRAPD( error, iData = iData->ReAllocL( + iData->Length() + aBodyData.Length() ) ); + + if ( KErrNone == error ) + { + // Get old descriptor data into the pointer. + dataPtr.Set( iData->Des() ); + // Copy the new data at the end of the descriptor. + dataPtr.Append( aBodyData ); + } + } + + ACPLOG( "CAcpController::NotifyBodyReceived end" ); + } + +// --------------------------------------------------------------------------- +// CAcpController::NotifyContentTypeReceived +// From MAcpHttpHandlerObserver. +// --------------------------------------------------------------------------- +// +void CAcpController::NotifyContentTypeReceived( const TDesC8& aContentData ) + { + ACPLOG( "CAcpController::NotifyContentTypeReceived begin" ); + + TInt index = ActiveIndex(); + + if ( index >= 0 && index < iProviders.Count() ) + { + CAcpProvider& provider = *iProviders[index]; + // Set the new content type of the received file + // into the provider content + TRAP_IGNORE( provider.SetContentDataL( aContentData ) ); + } + + ACPLOG( "CAcpController::NotifyContentTypeReceived end" ); + } + +// --------------------------------------------------------------------------- +// CAcpController::NotifySessionIdReceivedL +// From MAcpHttpHandlerObserver. +// --------------------------------------------------------------------------- +// +void CAcpController::NotifySessionIdReceivedL( const TDesC8& aSessionId ) + { + delete iSessionId; + iSessionId = NULL; + iSessionId = aSessionId.AllocL(); + } + +// --------------------------------------------------------------------------- +// CAcpController::NotifyImageCompletion +// From class MImageHandlerObserver. +// An asynchronous notify has occurred related to a icon +// file downloading for the provider. +// --------------------------------------------------------------------------- +// +void CAcpController::NotifyImageCompletion( TInt aErr ) + { + ACPLOG2( "CAcpController::NotifyImageCompletion begin status=%d", aErr ); + + const TInt providerCount = iProviders.Count(); + + if ( KErrNone == aErr ) + { + // Gets an index activated. + TInt index = ActiveIndex(); + + // Checks the index validity. + if ( index < providerCount ) + { + // Gets a provider. + CAcpProvider& provider = *iProviders[index]; + + // Gets a bitmap already converted. + CFbsBitmap* bitmap = iImageHandler->GetBitmap(); + CFbsBitmap* mask = iImageHandler->GetMask(); + + if ( bitmap && mask ) + { + // Set the bitmap to the provider. + TRAP_IGNORE( provider.SetBitmapL( bitmap, mask ) ); + } + + // Handle next index if the providers list end wasn't reached. + index++; + SaveActiveIndex( index ); + if ( index < providerCount ) + { + TPtrC8 iconUrl; + + // Find the next index with an icon URL. + index = NextIndexWithIconUrl( iconUrl ); + + if ( KErrNotFound != index ) + { + // Delete data buffer. + TPtr8 dataPtr( iData->Des() ); + dataPtr.Delete( 0, iData->Length() ); + + // Downloading the icon file from network. + TRAPD( err, FetchIconFileFromNetworkL( iconUrl ) ); + if ( KErrNone != err ) + { + iObserver.NotifyProviderListReady( err ); + } + } + else // No more icons to load, notify the observer. + { + iObserver.NotifyProviderListReady( KErrNone ); + } + } + else + { + // Tell the client that the provider list is now ready + // for displaying on the screen. + iObserver.NotifyProviderListReady( KErrNone ); + } + } + } + else + { + // An error notify to the client. + iObserver.NotifyProviderListReady( aErr ); + } + ACPLOG( "CAcpController::NotifyImageCompletion end" ); + } + +// --------------------------------------------------------------------------- +// CAcpController::ProfileRegistryEventOccurred +// From MSIPProfileRegistryObserver. +// SIP profile information event. +// --------------------------------------------------------------------------- +// +void CAcpController::ProfileRegistryEventOccurred( + TUint32 /*aSIPProfileId*/, + TEvent aEvent ) + { + ACPLOG2( "CAcpController::ProfileRegistryEventOccurred: %d", aEvent ); + + switch ( aEvent ) + { + case EProfileCreated: + { + // Notify settings saved if not sis-installation + if ( !iSisInstallation ) + { + iObserver.NotifySettingsSaved(); + } + } + break; + + default: + break; + } + } + +// --------------------------------------------------------------------------- +// CAcpController::ProfileRegistryErrorOccurred +// From MSIPProfileRegistryObserver. +// An asynchronous error has occurred related to SIP profile. +// --------------------------------------------------------------------------- +// +void CAcpController::ProfileRegistryErrorOccurred( + TUint32 /*aSIPProfileId*/, + TInt aError ) + { + ACPLOG2( "CAcpController::ProfileRegistryErrorOccurred: %d", aError ); + //To remove warning: variable / argument 'aError' is not used in function + aError = aError; + } + + +// End of file.