diff -r 000000000000 -r 3ce708148e4d pnpmobileservices/pnpms/OnlineSupport/src/MiniBrowser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pnpmobileservices/pnpms/OnlineSupport/src/MiniBrowser.cpp Thu Dec 17 08:40:12 2009 +0200 @@ -0,0 +1,801 @@ +/* +* Copyright (c) 2005-2006 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: Mini web browser for downloading settings files +* +*/ + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include +#include // For KLeaveExit +#include +#include // For R_AVKON_SOFTKEYS_CLOSE + +#include "MiniBrowser.h" +#include "OnlineSupportLogger.h" +#include "NHeadWrapperParser.h" +#include "SupportedContentTypes.h" +#include "VersionStrings.h" + +// 50 secs time-out +const TInt KTimeOut( 50000000 ); +const TInt KInitialDataBufferSize( 2048 ); +const TInt KInitialReportUrlBufferSize( 512 ); +// maximum length of the info message (currently not supported) +//const TInt KMaxMessageLength(256); +//_LIT( KMiniBrowserPanic, "CMiniBrowser" ); +_LIT8( KHttpProtString, "HTTP/TCP" ); +_LIT8( KNokiaHeadWrapper, "application/vnd.nokia.headwrapper" ); + +_LIT( KAmpersand, "&" ); +_LIT( KQuestionMark, "?" ); +_LIT( KStatus, "Status=" ); + +CMiniBrowser* CMiniBrowser::NewLC( + MMiniBrowserObserver& aObserver, + RSocketServ& aSockerServ, + RConnection& aConnection ) + { + CMiniBrowser* self = new (ELeave) CMiniBrowser( aObserver ); + CleanupStack::PushL( self ); + self->ConstructL( aSockerServ, aConnection ); + return self; + } + +CMiniBrowser* CMiniBrowser::NewL( + MMiniBrowserObserver& aObserver, + RSocketServ& aSockerServ, + RConnection& aConnection ) + { + CMiniBrowser* self = NewLC( aObserver, aSockerServ, aConnection ); + CleanupStack::Pop( self ); + return self; + } + +CMiniBrowser::~CMiniBrowser() + { + LOGSTRING( "CMiniBrowser::~CMiniBrowser" ); + if( iPeriodic->IsActive() ) + { + iPeriodic->Cancel(); + } + + delete iUri; + delete iPeriodic; + delete iResponseData; + delete iReportUrl; + iTransaction.Close(); + iSession.Close(); + + LOGSTRING( "CMiniBrowser::~CMiniBrowser - done" ); + } + +CMiniBrowser::CMiniBrowser( MMiniBrowserObserver& aObserver ) : + iObserver( aObserver ), + iContentType( EContentTypeUnknown ), + iProvisioningStatus( THttpProvStates::EStatusUnknown ) + { + } + +void CMiniBrowser::ConstructL( RSocketServ& aSockerServ, RConnection& aConnection ) + { + LOGSTRING( "CMiniBrowser::ConstructL" ); + + iUri = HBufC8::NewL(1); + iPeriodic = CPeriodic::NewL( CActive::EPriorityStandard ); + iResponseData = HBufC8::NewL( KInitialDataBufferSize ); + iReportUrl = HBufC8::NewL( KInitialReportUrlBufferSize ); + + // Opens session using protocol HTTP/TCP + LOGSTRING( "CMiniBrowser: iSession.OpenL" ); + iSession.OpenL( KHttpProtString ); + LOGSTRING( "CMiniBrowser: iSession.OpenL - done" ); + iSessionStringPool = iSession.StringPool(); + + RHTTPConnectionInfo connectionInfo = iSession.ConnectionInfo(); + + // Set SocketServ and Connection explicitly as we do not want to show + // the AP selection list to the user when making submit for the request + connectionInfo.SetPropertyL( + iSessionStringPool.StringF( HTTP::EHttpSocketServ, + RHTTPSession::GetTable() ), + aSockerServ.Handle() ); + connectionInfo.SetPropertyL( + iSessionStringPool.StringF( HTTP::EHttpSocketConnection, + RHTTPSession::GetTable() ), + reinterpret_cast< TInt > ( &aConnection ) ); + LOGSTRING( "CMiniBrowser::ConstructL - done" ); + } + +void CMiniBrowser::HttpGetL( const TDesC& aUri ) + { + DoHttpGetL( aUri, EFalse, KNullDesC, 0 ); + } + +void CMiniBrowser::HttpGetL( const TDesC& aUri, const TDesC& aProxyAddress, + const TUint aProxyPort ) + { + DoHttpGetL( aUri, ETrue, aProxyAddress, aProxyPort ); + } + +void CMiniBrowser::DoHttpGetL( + const TDesC& aUri, + const TBool aUseProxy, + const TDesC& aProxyAddress, + const TUint aProxyPort ) + { + LOGSTRING( "CMiniBrowser::DoHttpGetL" ); + + ResetResponseDataL(); + + delete iUri; + iUri = 0; + iUri = HBufC8::NewL( aUri.Length() ); + iUri->Des().Copy( aUri ); + + TUriParser8 uriParser; + + // In case URL is not valid the transaction will fail with code KErrHttpInvalidUri + // uriParser does not leave in all invalid uri cases +#ifdef _DEBUG + LOGSTRING( "CMiniBrowser::HttpGetL uri:" ); + //LOGTEXT( aUri ); + for( TInt i(0); i < aUri.Length(); i += 128 ) + { + LOGTEXT( aUri.Right( aUri.Length() - i ) ); + } +#endif + User::LeaveIfError( uriParser.Parse( *iUri ) ); + + RHTTPConnectionInfo connectionInfo = iSession.ConnectionInfo(); + + // The default value is HTTP::EDoNotUseProxy + if( aUseProxy ) + { + LOGSTRING("CMiniBrowser: using proxy"); + connectionInfo.SetPropertyL( + iSessionStringPool.StringF( HTTP::EProxyUsage, RHTTPSession::GetTable() ), + iSessionStringPool.StringF( HTTP::EUseProxy, RHTTPSession::GetTable() ) ); + + LOGSTRING("Set Proxy address") + HBufC8* proxy = HBufC8::NewLC( aProxyAddress.Length() + 1 + 16 ); + TPtr8 proxyPtr = proxy->Des(); + proxyPtr.Copy( aProxyAddress ); + proxyPtr.Append( _L8( ":" ) ); + proxyPtr.AppendNum( aProxyPort ); + LOGTEXT( proxyPtr ); + + RStringF proxyF = iSessionStringPool.OpenFStringL( *proxy ); + CleanupClosePushL( proxyF ); + + connectionInfo.SetPropertyL( + iSessionStringPool.StringF( HTTP::EProxyAddress, RHTTPSession::GetTable() ), + proxyF ); + + CleanupStack::PopAndDestroy(1); // proxyF.Close() + CleanupStack::PopAndDestroy( proxy ); + } + else + { + LOGSTRING("CMiniBrowser: NOT using proxy"); + connectionInfo.SetPropertyL( + iSessionStringPool.StringF( HTTP::EProxyUsage, RHTTPSession::GetTable() ), + iSessionStringPool.StringF( HTTP::EDoNotUseProxy, RHTTPSession::GetTable() ) ); + } + + LOGSTRING( "CMiniBrowser: iSession.OpenTransactionL" ); + iTransaction = iSession.OpenTransactionL( uriParser, *this, + iSessionStringPool.StringF( HTTP::EGET, RHTTPSession::GetTable() ) ); + LOGSTRING( "CMiniBrowser: iSession.OpenTransactionL - done" ); + + + // Set user agent string (we have our own user agent string definition, + // not Mozilla compatible) + HBufC8* userAgent = NULL; + TRAPD( err, userAgent = GetUserAgentStringL() ); + if( err != KErrNone ) + { + LOGSTRING2( "Error in GetUserAgentStringL: %i", err ); + } + else + { + CleanupStack::PushL( userAgent ); + LOGTEXT( *userAgent ); + RHTTPHeaders headers = iTransaction.Request().GetHeaderCollection(); + RStringF str = iSessionStringPool.OpenFStringL( *userAgent ); + CleanupClosePushL( str ); + headers.SetFieldL( + iSessionStringPool.StringF( HTTP::EUserAgent, RHTTPSession::GetTable() ), + str ); + CleanupStack::PopAndDestroy(); // str.Close() + CleanupStack::PopAndDestroy( userAgent ); + } + + + TCallBack callBack( TimeOutCallBack, this ); + if( iPeriodic->IsActive() ) + { + iPeriodic->Cancel(); + } + iPeriodic->Start( KTimeOut, KTimeOut, callBack ); + + iTransaction.SubmitL(); + LOGSTRING( "CMiniBrowser::HttpGetL - done" ); + } + +HBufC8* CMiniBrowser::GetUserAgentStringL() + { + LOGSTRING("CMiniBrowser::GetUserAgentStringL"); + + _LIT8( KUserAgentName, "OnlineSupport"); + _LIT8( KSlash, "/"); + _LIT8( KSpace, " "); + _LIT8( KSymbianOS, "SymbianOS"); + _LIT8( KS60, "Series60"); + _LIT8( KQuestionMark, "?" ); + _LIT( KPhoneModuleName, "Phonetsy.tsy"); + _LIT( KPhoneName, "DefaultPhone"); + const TChar lineFeedChar( 0xA ); + + RTelServer telServer; + User::LeaveIfError( telServer.Connect() ); + CleanupClosePushL( telServer ); + User::LeaveIfError( telServer.LoadPhoneModule( KPhoneModuleName ) ); + RMobilePhone phone; + User::LeaveIfError( phone.Open( telServer, KPhoneName ) ); + CleanupClosePushL( phone ); + LOGSTRING("CMiniBrowser::GetUserAgentStringL 2"); + + RMobilePhone::TMobilePhoneIdentityV1 phoneIdentity; + TRequestStatus status( KRequestPending ); + phone.GetPhoneId( status, phoneIdentity ); + User::WaitForRequest( status ); + + + // parse sw version from the string + // sw version is assumed to be string between first "V" and "\n" + LOGSTRING("Reading sw version info"); + TBuf versions; + User::LeaveIfError( SysUtil::GetSWVersion( versions ) ); + LOGTEXT( versions ); + + // SW version + LOGSTRING("Locating sw version from the string"); + TInt begin(0); + TInt len(0); + // Assume sw version is in the first row (use line feed as a token separator) + TBuf8 sw; + TVersionStrings::TokenLocationL( versions, lineFeedChar, 0, sw.MaxLength(), begin, len ); + if( len <= 2 ) + { + User::Leave( KErrNotFound ); + } + + _LIT(KVerStrStart,"V "); + TInt pos1 = versions.Find(KVerStrStart); + if (pos1 != KErrNotFound) + { + sw.Copy( versions.Mid( begin + 2, len - 2 ) ); // remove "V " + } + else + { + // SW version does not always start with "V " + sw.Copy( versions.Mid( begin, len ) ); + } + + LOGTEXT( sw ); + + + // Series 60 and Symbian OS versions + LOGSTRING("Reading OS versions"); + TVersionBuf s60Version; + s60Version.Copy( KQuestionMark ); + TVersionBuf symbianVersion; + symbianVersion.Copy( KQuestionMark ); + TRAPD( err, TVersionStrings::GetUserAgentVersionsL( s60Version, symbianVersion ) ); + if( err != KErrNone ) + { + LOGSTRING2( "Error: %i", err ); + } + + LOGSTRING("Series60 version"); + LOGTEXT( s60Version ); + LOGSTRING("SymbianOS version"); + LOGTEXT( symbianVersion ); + + + LOGSTRING("CMiniBrowser::GetUserAgentStringL 3"); + // The string is of format: + // OnlineSupport / SymbianOS/ S60/ + HBufC8* agent = HBufC8::NewLC( + KUserAgentName().Length() + + phoneIdentity.iManufacturer.Length() + + phoneIdentity.iModel.Length() + + sw.Length() + + KSymbianOS().Length() + + symbianVersion.Length() + + KS60().Length() + + s60Version.Length() + + 3 * KSlash().Length() + /* three slasles in the string */ + 3 * KSpace().Length() /* three spaces in the string */ + ); + LOGSTRING("CMiniBrowser::GetUserAgentStringL 3.5"); + TPtr8 agentPtr = agent->Des(); + agentPtr.Append( KUserAgentName ); + agentPtr.Append( KSpace); + agentPtr.Append( phoneIdentity.iManufacturer ); + agentPtr.Append( phoneIdentity.iModel ); + agentPtr.Append( KSlash ); + agentPtr.Append( sw ); + agentPtr.Append( KSpace); + agentPtr.Append( KSymbianOS ); + agentPtr.Append( KSlash); + agentPtr.Append( symbianVersion ); + agentPtr.Append( KSpace); + agentPtr.Append( KS60 ); + agentPtr.Append( KSlash); + agentPtr.Append( s60Version ); + + LOGSTRING("CMiniBrowser::GetUserAgentStringL 4"); + CleanupStack::Pop( agent ); + CleanupStack::PopAndDestroy(); // phone.Close() + CleanupStack::PopAndDestroy(); // telServer.Close() + LOGSTRING("CMiniBrowser::GetUserAgentStringL - done"); + return agent; + } + + +TInt CMiniBrowser::TimeOutCallBack( TAny* aMiniBrowser) + { + TRAPD( err, ( ( CMiniBrowser* ) aMiniBrowser )->DoTimeOutCallBackL() ); + if( err == KLeaveExit ) + { + User::Leave( KLeaveExit ); + } + return err; + } + +void CMiniBrowser::DoTimeOutCallBackL() + { + LOGSTRING( "CMiniBrowser::DoTimeOutCallBackL" ); + if( iPeriodic->IsActive() ) + { + iPeriodic->Cancel(); + } + + TRAPD( err, iObserver.MiniBrowserErrorL( KErrTimedOut ) ); + if( err != KErrNone ) + { + iObserver.MiniBrowserUnhandledLeave( err ); + } + if( err == KLeaveExit ) + { + User::Leave( err ); + } + + LOGSTRING( "CMiniBrowser::DoTimeOut - done" ); + } + +void CMiniBrowser::MHFRunL( RHTTPTransaction aTransaction, const THTTPEvent &aEvent ) + { + LOGSTRING( "CMiniBrowser::MHFRunL" ); + if( iPeriodic->IsActive() ) + { + iPeriodic->Cancel(); + } + + switch( aEvent.iStatus ) + { + case THTTPEvent::ESubmit: + { + LOGSTRING( "CMiniBrowser::MHFRunL:ESubmit" ); + LOGTEXT( aTransaction.Request().URI().UriDes() ); + + LOGSTRING( "CMiniBrowser: reset ResponseData" ); + ResetResponseDataL(); + break; + } + case THTTPEvent::EGotResponseHeaders: + { + LOGSTRING( "CMiniBrowser::MHFRunL:EGotResponseHeaders" ); + THTTPHdrVal value; + TInt err = aTransaction.Response().GetHeaderCollection().GetField( + iSessionStringPool.StringF( HTTP::EContentType, RHTTPSession::GetTable() ), 0, value ); + + if( err == KErrNone ) + { + LOGSTRING("Content type:"); + const TDesC8& contentType = value.StrF().DesC(); + LOGTEXT( contentType ); + if( contentType.Compare( KNokiaHeadWrapper ) == 0 ) + { + iContentType = EContentTypeNokiaHeadWrapper; + } + else + { + iContentType = EContentTypeUnknown; + } + } + + TCallBack callBack( TimeOutCallBack, this ); + if( iPeriodic->IsActive() ) + { + iPeriodic->Cancel(); + } + iPeriodic->Start( KTimeOut, KTimeOut, callBack ); + break; + } + case THTTPEvent::EGotResponseBodyData: + { + LOGSTRING( "CMiniBrowser::MHFRunL:EGotResponseBodyData" ); + MHTTPDataSupplier* pBody = aTransaction.Response().Body(); + if( pBody ) + { + TPtrC8 dataChunk; + pBody->GetNextDataPart( dataChunk ); + // Log + LOGSTRING( "CMiniBrowser: MHTTPDataSupplier:" ); +#ifdef _DEBUG + for( TInt i(0); i < dataChunk.Length(); i += 128 ) + { + LOGTEXT( dataChunk.Right( dataChunk.Length() - i ) ); + } +#endif + AppendResponseDataL( dataChunk ); + pBody->ReleaseData(); + } + LOGSTRING( "CMiniBrowser::MHFRunL:EGotResponseBodyData - 2" ); + + TCallBack callBack( TimeOutCallBack, this ); + if( iPeriodic->IsActive() ) + { + iPeriodic->Cancel(); + } + iPeriodic->Start( KTimeOut, KTimeOut, callBack ); + break; + } + case THTTPEvent::EResponseComplete: + { + LOGSTRING( "CMiniBrowser::MHFRunL:EResponseComplete" ); + break; + } + case THTTPEvent::ESucceeded: + { + LOGSTRING( "CMiniBrowser::MHFRunL:ESucceeded" ); + + if( iContentType == EContentTypeNokiaHeadWrapper ) + { + TRAPD( err, ParseAndSaveProvisionedSettingsL() ); + if( err != THttpProvStates::EStatusOk ) + { + User::Leave( err ); + } + } + else if( iContentType == EContentTypeUnknown ) + { + TRAPD( err, ParseAndSaveProvisionedSettingsL() ); + if( err != THttpProvStates::EStatusOk ) + { + User::Leave( err ); + } + } + iObserver.MiniBrowserRequestDoneL(); + } + break; + case THTTPEvent::EFailed: + LOGSTRING( "CMiniBrowser::MHFRunL:EFailed" ); + ResetResponseDataL(); + User::Leave( KErrGeneral ); + break; + default: + { + LOGSTRING2( "CMiniBrowser::MHFRunL:event: %i", aEvent.iStatus ); + break; + } + } + + LOGSTRING( "CMiniBrowser::MHFRunL - done" ); + } + +// currently not supported +//void CMiniBrowser::ShowMessageDialogL( const TDesC8& aMessage ) +// { +// LOGSTRING( "ShowMessageDialogL" ); +// LOGTEXT( aMessage ); +// TInt length = aMessage.Length(); +// if( length > KMaxMessageLength ) +// { +// length = KMaxMessageLength; +// } +// HBufC* message = HBufC::NewLC( length ); +// message->Des().Copy( aMessage.Left( length ) ); +// +// CAknGlobalNote* globalNote = CAknGlobalNote::NewL(); +// CleanupStack::PushL( globalNote ); +// globalNote->SetSoftkeys( R_AVKON_SOFTKEYS_CLOSE ); +// globalNote->ShowNoteL( EAknGlobalInformationNote , *message ); +// +// LOGSTRING( "deleting globalNote" ); +// CleanupStack::PopAndDestroy( globalNote ); +// CleanupStack::PopAndDestroy( message ); +// LOGSTRING( "ShowMessageDialogL - done" ); +// } + + +void CMiniBrowser::ParseAndSaveProvisionedSettingsL() + { + LOGSTRING( "CMiniBrowser::ParseAndSaveProvisionedSettingsL - begin" ); + if( !iResponseData ) + { + User::Leave( THttpProvStates::EStatusWrapperParsingFailed ); + } + LOGSTRING( "CMiniBrowser::SaveProvisionedSettingsL - 2" ); + CNHeadWrapperParser* NHwrParser = CNHeadWrapperParser::NewL( *iResponseData ); + CleanupStack::PushL( NHwrParser ); + LOGSTRING( "CMiniBrowser::SaveProvisionedSettingsL - 3" ); + iProvisioningStatus = NHwrParser->Parse(); + LOGSTRING( "CMiniBrowser::SaveProvisionedSettingsL - 4" ); + if( iProvisioningStatus != THttpProvStates::EStatusOk ) + { + LOGSTRING2( "status from parse:%i", iProvisioningStatus ); + // Try to get report url anyways, this should succeed at leat in case + // Nokia HeadWrapper authentication failed while parsing an otherwise valid + // HeadWrapper document + GetReportUrlL( *NHwrParser ); + User::Leave( iProvisioningStatus ); + } + LOGSTRING( "CMiniBrowser::SaveProvisionedSettingsL - 5" ); + GetReportUrlL( *NHwrParser ); + LOGSTRING( "CMiniBrowser::SaveProvisionedSettingsL - 6" ); + // Get provisioned data + TPtrC8 content; + TRAPD( err, content.Set( NHwrParser->GetContentL() ) ); + if( err != KErrNone ) + { + LOGSTRING2( "err from GetContentL:%i", err ); + iProvisioningStatus = THttpProvStates::EStatusDocumentParsingFailed; + User::Leave( err ); + } + + LOGSTRING( "Response parsed" ); + + TPtrC8 contentType; + TRAP( err, contentType.Set( NHwrParser->GetContentTypeL() ) ); + if( err != KErrNone ) + { + LOGSTRING2( "err from GetContentTypeL:%i", err ); + iProvisioningStatus = THttpProvStates::EStatusDocumentParsingFailed; + User::Leave( err ); + } + + if( contentType.Compare( KContentTypeApplicationWapConnectivityWbxml ) == 0 ) + { + LOGSTRING( "CMiniBrowser: content type application/vnd.wap.connectivity-wbxml" ); + TRAP( err, SaveProvisionedSettingsL( content ) ); + iProvisioningStatus = (THttpProvStates::TProvisioningStatus) err; + if( iProvisioningStatus != THttpProvStates::EStatusOk ) + { + LOGSTRING2( "ProvisioningStatus from SaveProvisionedSettingsL:%i", iProvisioningStatus ); + User::Leave( iProvisioningStatus ); + } + } +// currently not supported +// else if( contentType.Compare( KContentTypeTextPlain ) == 0 ) +// { +// LOGSTRING( "CMiniBrowser: content type text/plain" ); +// ShowMessageDialogL( content ); +// } + else + { + LOGSTRING( "CMiniBrowser: Unknown content type" ); + User::Leave( THttpProvStates::EStatusWrapperParsingFailed ); + } + + CleanupStack::PopAndDestroy( NHwrParser ); + LOGSTRING( "CMiniBrowser::SaveProvisionedSettingsL - done" ); + } + +void CMiniBrowser::GetReportUrlL( const CNHeadWrapperParser& aNHwrParser ) + { + LOGSTRING( "CMiniBrowser::GetReportUrlL - begin" ); + // Store report URL for later reference + const TDesC8& reportUrl = aNHwrParser.GetReportUrlL(); + if( iReportUrl->Des().MaxLength() < reportUrl.Length() ) + { + delete iReportUrl; + iReportUrl = 0; + iReportUrl = HBufC8::NewL( reportUrl.Length() ); + } + TPtr8 reportUrlPtr = iReportUrl->Des(); + reportUrlPtr.Copy( reportUrl ); + LOGTEXT( *iReportUrl ); + LOGSTRING( "CMiniBrowser::GetReportUrlL - end" ); + } + +HBufC* CMiniBrowser::GetReportUrlLC() + { + LOGSTRING( "CMiniBrowser::GetReportUrlLC - begin" ); + if( iReportUrl && iReportUrl->Length() ) + { + HBufC* url = HBufC::NewLC( + iReportUrl->Length() + + KAmpersand().Length() + + KQuestionMark().Length() + + KStatus().Length() ); + + TPtr urlPtr = url->Des(); + urlPtr.Copy( *iReportUrl ); + + // Add provisioning status to the url if known + if( iProvisioningStatus != THttpProvStates::EStatusUnknown ) + { + // Assume there might already be parameters in the URL given + if( urlPtr.Find( KQuestionMark ) != KErrNotFound ) + { + urlPtr.Append( KAmpersand ); + } + else + { + urlPtr.Append( KQuestionMark ); + } + urlPtr.Append( KStatus ); + urlPtr.AppendNum( (TInt) iProvisioningStatus ); + } + LOGSTRING( "CMiniBrowser::GetReportUrlLC - end" ); + return url; + } + else + { + LOGSTRING( "CMiniBrowser::GetReportUrlLC Leave KErrNotFound" ); + User::Leave( KErrNotFound ); + } + return NULL; // Not possible to end up here + } + +void CMiniBrowser::SaveProvisionedSettingsL( const TDesC8& aContent ) + { + LOGSTRING( "CMiniBrowser::SaveProvisionedSettingsL" ); + TInt status = THttpProvStates::EStatusOk; + // Create WPEngine + CWPEngine* wpengine = CWPEngine::NewL(); + CleanupStack::PushL( wpengine ); + + LOGSTRING( "wpengine->ImportDocumentL" ); + TRAPD( err, wpengine->ImportDocumentL( aContent ) ); + User::LeaveIfError( err ); + + LOGSTRING( "wpengine->PopulateL" ); + TRAP( err, wpengine->PopulateL() ); + if( err != KErrNone ) + { + LOGSTRING2( "PopulateL err: %i", err ); + User::Leave( err ); + } + LOGSTRING( "wpengine->PopulateL success" ); + + TInt itemCount = wpengine->ItemCount(); + // Empty messages are not supported + if( itemCount == 0 ) + { + LOGSTRING("No items in provisioning message!"); + User::Leave( THttpProvStates::EStatusWrapperParsingFailed ); + } + + for( TInt i(0); i < itemCount; i++ ) + { + LOGSTRING( "Saving" ); + TRAP( err, wpengine->SaveL( i ) ); + if( wpengine->CanSetAsDefault( i ) ) + { + LOGSTRING( "Setting as default" ); + TRAP( err, wpengine->SetAsDefaultL( i ) ); + } + else + { + LOGSTRING( "Cannot set as default" ); + } + if( err != KErrNone ) + { + LOGSTRING2( "Error while saving: %i", err ); + status = THttpProvStates::EStatusStorageFailed; + } + } + + if( status != THttpProvStates::EStatusOk ) + { + User::Leave( status ); + } + } + +TInt CMiniBrowser::MHFRunError( TInt aError, RHTTPTransaction /*aTransaction*/, const THTTPEvent& /*aEvent*/ ) + { + LOGSTRING2( "CMiniBrowser::MHFRunError %i", aError ); + iTransaction.Close(); + TRAPD( err, iObserver.MiniBrowserErrorL( aError ) ); + if( err != KErrNone ) + { + iObserver.MiniBrowserUnhandledLeave( err ); + } + LOGSTRING( "CMiniBrowser::MHFRunError - done" ); + if( err == KLeaveExit ) + { + return err; + } + return KErrNone; + } + + +void CMiniBrowser::AppendResponseDataL( const TDesC8& aData ) + { + LOGSTRING( "CMiniBrowser::AppendResponseDataL()" ); + if( ( iResponseData->Des().MaxLength() - iResponseData->Length() ) < aData.Length() ) + { + // ReAlloc + HBufC8* tempBuf = HBufC8::NewL( iResponseData->Length() + aData.Length() ); + TPtr8 tempBufPtr = tempBuf->Des(); + tempBufPtr.Append( *iResponseData ); + delete iResponseData; + iResponseData = tempBuf; + } + + TPtr8 ptr = iResponseData->Des(); + ptr.Append( aData ); + LOGSTRING( "CMiniBrowser::AppendResponseDataL() - done" ); + } + +void CMiniBrowser::ResetResponseDataL() + { + LOGSTRING( "CMiniBrowser::ResetResponseDataL()" ); + if( iResponseData && iResponseData->Length() ) + { + delete iResponseData; + iResponseData = 0; + iResponseData = HBufC8::NewL( KInitialDataBufferSize ); + } + if( iReportUrl && iReportUrl->Length() ) + { + delete iReportUrl; + iReportUrl = 0; + iReportUrl = HBufC8::NewL( KInitialReportUrlBufferSize ); + } + iContentType = EContentTypeUnknown; + iProvisioningStatus = THttpProvStates::EStatusUnknown; + LOGSTRING( "CMiniBrowser::ResetResponseDataL() - done" ); + } + +TBool CMiniBrowser::GetNextDataPart( TPtrC8 &aDataPart ) + { + _LIT8( KEmpty, ""); + aDataPart.Set( KEmpty() ); + return ETrue; + } + +void CMiniBrowser::ReleaseData() + { + } + +TInt CMiniBrowser::OverallDataSize() + { + return KErrNotFound; + } + +TInt CMiniBrowser::Reset() + { + return KErrNone; + }