--- /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 <AiwGenericParam.h>
+#include <CodEng.h>
+#include <DdEng.h>
+#include <CodUtil.h>
+#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<RFile>( 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.
+ }