diff -r 000000000000 -r dd21522fd290 codhandler/codui/src/CodDocument.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/codhandler/codui/src/CodDocument.cpp Mon Mar 30 12:54:55 2009 +0300 @@ -0,0 +1,223 @@ +/* +* Copyright (c) 2004 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Implementation of class CCodDocument. +* +*/ + + +// INCLUDE FILES + +#include +#include +#include +#include +#include "CodDocument.h" +#include "CodAppUi.h" +#include "RequestCompleteCallback.h" +#include "CodLogger.h" + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------- +// CCodDocument::CodAppUi() +// --------------------------------------------------------- +// +CCodAppUi* CCodDocument::CodAppUi() + { + // Inline method must be defined before it is used. + return STATIC_CAST( CCodAppUi*, iAppUi ); + } + +// --------------------------------------------------------- +// CCodDocument::NewL() +// --------------------------------------------------------- +// +CCodDocument* CCodDocument::NewL( CEikApplication& aApp, TBool aCod ) + { + CCodDocument* doc = new (ELeave) CCodDocument( aApp, aCod ); + CleanupStack::PushL( doc ); + doc->ConstructL(); + CleanupStack::Pop( doc ); + return doc; + } + +// --------------------------------------------------------- +// CCodDocument::~CCodDocument() +// --------------------------------------------------------- +// +CCodDocument::~CCodDocument() + { + delete iModel; // Delete (==Cancel) the model... + delete iCallback; // ...before deleting (==Cancelling) the callback. + } + +// --------------------------------------------------------- +// CCodDocument::Model() +// --------------------------------------------------------- +// +CCodEngBase& CCodDocument::Model() + { + return *iModel; + } + +// --------------------------------------------------------- +// CCodDocument::CreateAppUiL() +// --------------------------------------------------------- +// +CEikAppUi* CCodDocument::CreateAppUiL() + { + return new (ELeave) CCodAppUi( iCod ); + } + +// --------------------------------------------------------- +// CCodDocument::OpenFileL() +// --------------------------------------------------------- +// +CFileStore* CCodDocument::OpenFileL +( TBool aDoOpen, const TDesC& aFilename, RFs& aFs ) + { + CLOG(( 2, _L("-> CCodDocument::OpenFileL aDoOpen(0x%x) aFname<%S>"), \ + aDoOpen, &aFilename )); + CFileStore* store( NULL ); + if ( aDoOpen ) + { + RFile file; + TInt err = file.Open( aFs, aFilename, + EFileShareReadersOnly | EFileStream | EFileRead ); + if ( err == KErrInUse ) + { + err = file.Open( aFs, aFilename, + EFileShareAny | EFileStream | EFileRead ); + } + User::LeaveIfError( err ); + CleanupClosePushL( file ); + store = OpenFileL( aFs, file ); + CleanupStack::PopAndDestroy(); // close file + } + CLOG(( 2, _L("<- CCodDocument::OpenFileL") )); + return store; + } + +// --------------------------------------------------------- +// CCodDocument::OpenFileL() +// --------------------------------------------------------- +// +CFileStore* CCodDocument::OpenFileL( RFs& /*aFs*/, RFile& aFile ) + { + CLOG(( 2, _L("-> CCodDocument::OpenFileL (RFs+RFile)") )); + CFileStore* store( NULL ); + OpenFileL( store, aFile ); + CLOG(( 2, _L("<- CCodDocument::OpenFileL (RFs+RFile)") )); + return store; + } + +// --------------------------------------------------------- +// CCodDocument::OpenFileL() +// --------------------------------------------------------- +// +void CCodDocument::OpenFileL( CFileStore*& aFileStore, RFile& aFile ) + { + CLOG(( 2, _L("-> CCodDocument::OpenFileL (RFile)") )); + if( iModel->IsActive() ) + { + // Busy with something else. + // Maybe we should Cancel the ongoing operation? I don't think so. + CLOG(( 2, _L(" leave with KErrNotReady") )); + User::Leave( KErrNotReady ); + } + + // Get params, extract the UI related ones. + const CAiwGenericParamList* params = GetInputParameters(); + if ( params ) + { + TBool silent( EFalse ); + TBool suppressNextUrl( EFalse ); + TBool suppressLaunch( EFalse ); + CodUtil::GetBoolParam( silent, EGenericParamSilentDownload, *params ); + CodUtil::GetBoolParam + ( suppressNextUrl, EGenericParamSuppressNextUrl, *params ); + CodUtil::GetBoolParam + ( suppressLaunch, EGenericParamSuppressLaunch, *params ); + CodAppUi()->SetServiceFlow( silent, suppressNextUrl, suppressLaunch ); + } + + // Read descriptor data from file. + TInt fSize; + User::LeaveIfError( aFile.Size( fSize ) ); + HBufC8* buf = HBufC8::NewLC( fSize ); + TPtr8 bufP( buf->Des() ); + User::LeaveIfError( aFile.Read( bufP ) ); + + iModel->SetL( bufP, &iCallback->iStatus, params, NULL ); + iCallback->CallbackOnCompletion + ( TCallBack( StaticOpenFileDone, this ) ); + CleanupStack::PopAndDestroy( buf ); + aFileStore = NULL; + CLOG(( 2, _L("<- CCodDocument::OpenFileL (RFile)") )); + } + +// --------------------------------------------------------- +// CCodDocument::CCodDocument() +// --------------------------------------------------------- +// +CCodDocument::CCodDocument( CEikApplication& aApp, TBool aCod ) +: CAiwGenericParamConsumer( aApp ), iCod( aCod ) + { + } + +// --------------------------------------------------------- +// CCodDocument::ConstructL() +// --------------------------------------------------------- +// +void CCodDocument::ConstructL() + { + if ( iCod ) + { + iModel = CCodEng::NewL( iEikProcess, NULL ); + } + else + { + iModel = CDdEng::NewL( iEikProcess, NULL ); + } + + iCallback = new ( ELeave ) CRequestCompleteCallback(); + } + +// --------------------------------------------------------- +// CCodDocument::OpenFileDone() +// --------------------------------------------------------- +// +void CCodDocument::OpenFileDone() + { + CLOG(( 2, _L("-> CCodDocument::OpenFileDone") )); + // Note that it is possible that we don't have iAppUi here. There is + // blank screen with "Back" softkey while parsing the COD. + // During that, "Back" command may be issued and + // processed by AppUi during the wait. + if ( iAppUi ) + { + CodAppUi()->OpenFileDone( iCallback->iStatus.Int() ); + } + CLOG(( 2, _L("<- CCodDocument::OpenFileDone") )); + } + +// --------------------------------------------------------- +// CCodDocument::StaticOpenFileDone() +// --------------------------------------------------------- +// +TInt CCodDocument::StaticOpenFileDone( TAny* aPtr ) + { + STATIC_CAST( CCodDocument*, aPtr )->OpenFileDone(); + return EFalse; // TCallback should return EFalse as TInt. + }