ImagePrint/ImagePrintUI/imageprintapp/src/cimageprintappui.cpp
changeset 0 d11fb78c4374
child 1 ceeb73e410b5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/src/cimageprintappui.cpp	Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,550 @@
+/*
+* Copyright (c) 2004-2007 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:  
+*
+*/
+
+
+#include <imageprintapp.rsg>
+#include <AknQueryDialog.h>
+#include <aknnotewrappers.h>
+#include <aknstaticnotedialog.h>
+#include <MGFetch.h>
+#include <eikspane.h>
+#include <aknnavi.h>
+#include <aknnavide.h>
+#include <imageconversion.h>
+#include <StringLoader.h>
+#include <avkon.hrh>
+#include <bautils.h>
+#include <hlplch.h>
+#include <e32std.h>
+#include <coehelp.h>
+#include <hal.h>
+#include <apgcli.h>
+#include <s32file.h>
+#include <AiwGenericParam.h>
+#include <e32property.h>
+#include <featmgr.h>
+#include <caf/content.h>
+
+#include "cimageprintappui.h"
+#include "imageprint.h"
+#include "cimageprintsettingsview.h"
+#include "cimgpviewemptyview.h"
+#include "cdiscoverydlgmanager.h"
+#include "cimageprintdoc.h"
+#include "printapputil.h"
+#include "imageprintapp.hrh"
+#include "mprintsettings.h"
+#include "cimgpprintdlgmanager.h"
+#include "clog.h"
+#include "cimageprintengine.h"
+#include "ciffactory.h"
+#include "mdiscovery.h"
+#include "cimgpprintutils.h"
+#include "uimodefactory.h"
+#include "muimode.h"
+#include "muimodeobserver.h"
+#include "caiwprintpreviewprovider.h"
+
+using namespace ContentAccess;
+
+_LIT( KEngineRsc, "imageprintengine.rsc" );
+_LIT8( KJpegFileType, "image/jpeg" );
+
+// For navipane changes
+_LIT( KLine, " - " );
+const TInt KLineLength(3);
+const TInt32 KUid (0x101FFA84);
+
+// Second class constructor
+void CImagePrintAppUi::ConstructL()
+    {
+	LOG("CImagePrintAppUi::ConstructL BEGIN");
+
+    BaseConstructL( EAknEnableSkin | EAppOrientationAutomatic | EAknEnableMSK );	
+  	
+    FeatureManager::InitializeLibL();
+
+	// get the best matching resource for the current locale
+	TFileName file(NULL);	
+
+	file.Append( KDC_RESOURCE_FILES_DIR );
+	file.Append( KEngineRsc );
+	BaflUtils::NearestLanguageFile( iEikonEnv->FsSession(), file );
+    iResourceOffset = iEikonEnv->AddResourceFileL( file );
+
+    iDoc = static_cast<CImagePrintDoc*>( CAknAppUi::Document() );
+
+	TRAPD( err, iDoc->InitializeEngineL() );
+	if ( err == KErrInUse )
+		{
+		LOG("Too many connections. Exiting...");
+		CAknErrorNote* errornote = new (ELeave) CAknErrorNote( ETrue );
+		HBufC* buf = StringLoader::LoadLC( R_QTN_PRINT_CONCURRENT_NOTE );
+		errornote->ExecuteLD( *buf );
+		CleanupStack::PopAndDestroy( buf );
+		Exit();
+		}
+	else
+		{
+		User::LeaveIfError( err );
+		}
+
+    if ( iDoc->Engine()->InterfaceFactory().IsApplicationAlreadyInUse() )
+    	{
+    	LOG("Too many connections. Exiting...");
+		CAknErrorNote* errornote = new (ELeave) CAknErrorNote( ETrue );
+		HBufC* buf = StringLoader::LoadLC( R_QTN_PRINT_CONCURRENT_NOTE );
+		errornote->ExecuteLD( *buf );
+		CleanupStack::PopAndDestroy( buf );
+		Exit();
+    	}
+
+    iAiwState = ENotAiwCall;
+    TInt r = iAiwCall.Attach(KPrintPropertyCat,EPrintProperty,EOwnerProcess);
+    if (r == KErrNone)
+        {
+        iAiwCall.Get(KPrintPropertyCat,EPrintProperty,iAiwState);
+        }
+
+	TBool aiw = EFalse;
+	if ( iAiwState == EAiwPrintCall )
+        {
+		// Set the aiw call RProperty key back to default value so that
+		// if application for some reason crashes the value is not left for AIW mode.
+		iAiwCall.Set( KPrintPropertyCat,EPrintProperty, ENotAiwCall );
+        SetImageArrayL(GetImagesFromAiwProviderL());
+        aiw = ETrue;
+        }
+
+
+    iUIMode = UIModeFactory::CreateL( aiw, this, iDoc->Engine()->InterfaceFactory() );
+    
+	LOG("CImagePrintAppUi::ConstructL CImagePrintSettingsView");
+    CImagePrintSettingsView* settingsView = CImagePrintSettingsView::NewL(
+        iDoc->PrintSettings(), iDoc->PrintJob(), this, iUIMode );
+    CleanupStack::PushL( settingsView );
+	AddViewL( settingsView );
+    CleanupStack::Pop( settingsView );
+
+	LOG("CImagePrintAppUi::ConstructL CIMGPViewEmptyView");
+    CIMGPViewEmptyView* emptyView = CIMGPViewEmptyView::NewL();
+    CleanupStack::PushL( emptyView );
+	AddViewL( emptyView );
+    CleanupStack::Pop( emptyView);
+
+    SetDefaultViewL( *emptyView );
+    // default printer search in aiw mode must be done via
+    // CIdle callback for UI to construct itself properly
+    iIdleSearch = CIdle::NewL( CActive::EPriorityStandard );
+	iIdleSearch->Start( TCallBack( SearchDefaultPrinterCbL, this ));
+
+    // Default value for printer UID before printer is selected.
+    iPrinterUID = -1;
+
+    iCoeEnv->RootWin().EnableScreenChangeEvents();
+
+    iApplicationStarting = ETrue;
+    iAlbumCall = KErrNotFound;
+	LOG("CImagePrintAppUi::ConstructL END");
+    }
+
+// aiw search callback
+TInt CImagePrintAppUi::SearchDefaultPrinterCbL( TAny* aObj )
+	{
+	LOG("CImagePrintAppUi::SearchDefaultPrinterCbL begin");
+	CImagePrintAppUi* obj = static_cast<CImagePrintAppUi*>( aObj );
+	TRAPD( err, obj->iUIMode->SearchDefaultPrinterL() );
+	if ( err != KErrNone )
+		{
+		LOG1( "CImagePrintAppUi::SearchDefaultPrinterCbL search failed, err: %d", err );
+		
+		if ( err == KErrDisconnected )
+		    {
+			HBufC* buf = StringLoader::LoadLC( R_NOTE_DISCONNECT_PRINT_ERROR );
+    		CAknErrorNote* errornote = new CAknErrorNote( ETrue );       
+    		errornote->ExecuteLD( *buf );	        	
+    		CleanupStack::PopAndDestroy( buf );
+		    }
+
+        // Closes program
+		obj->Exit();
+		}
+	LOG("CImagePrintAppUi::SearchDefaultPrinterCbL end");
+	return EFalse;
+	}
+
+// Destructor
+CImagePrintAppUi::~CImagePrintAppUi()
+    {
+	FeatureManager::UnInitializeLib();
+    delete iNaviDecorator;
+
+    iEikonEnv->DeleteResourceFile( iResourceOffset );
+    delete iPrintDlgManager;
+    delete iUSBConnectionWaitNote;
+
+	if( iIdleSearch )
+		{
+		iIdleSearch->Cancel();
+		}
+	
+	delete iUIMode;
+	delete iIdleSearch;
+
+    iAiwCall.Close();
+    }
+
+// Handles global user events
+void CImagePrintAppUi::HandleCommandL(
+    TInt aCommand )
+    {
+    LOG1( "CImagePrintAppUi::HandleCommandL BEGIN: %d", aCommand );
+    switch ( aCommand )
+        {
+        case EAknCmdExit:
+        case EAknSoftkeyExit:
+            {
+            Exit();
+            break;
+            }
+        case EEikCmdExit:
+        	{
+        	// Cancel current printjob because this command may have come from MMC removal
+        	// cancelling may fail in engine if mmc writing was in critical point, so TRAP
+        	TRAP_IGNORE( iDoc->PrintJob()->CancelL() );
+        	if ( iAiwState == EAiwPrintCall )
+        		{
+	            User::Exit( EAiwPrintCall );
+        		}
+        	else
+        		{
+        		Exit();
+        		}
+            break;
+        	}
+
+        case EAknSoftkeyBack:
+            {       
+            break;
+            }
+
+        case ESelectMarked:
+            {
+			if( iValidImages )
+            	{
+				iUIMode->SearchDefaultPrinterL();
+				}
+			else
+				{
+           		CAknErrorNote* errornote = new (ELeave) CAknErrorNote( ETrue );
+				HBufC* buf = StringLoader::LoadLC( R_QTN_PRINT_SELECTNEW_NOTE );
+				errornote->ExecuteLD( *buf );
+				CleanupStack::PopAndDestroy( buf );
+				}
+			break;
+            }
+		default:
+            break;
+        }
+	LOG( "CImagePrintAppUi::HandleCommandL END" );        
+    }
+
+void CImagePrintAppUi::LaunchHelpApplicationL( const TDesC& aHelpText )
+    {
+    CArrayFix< TCoeHelpContext >* cntx = new( ELeave ) CArrayFixFlat< TCoeHelpContext >( 1 );
+    CleanupStack::PushL( cntx );
+
+    //make uid
+    TUid uid;
+    uid.iUid = ( KUid );
+
+    cntx->AppendL( TCoeHelpContext( uid, aHelpText ) );
+    CleanupStack::Pop( cntx );
+
+    //and launch help - takes ownership of context array
+    HlpLauncher::LaunchHelpApplicationL( iEikonEnv->WsSession(), cntx );
+    }
+
+// Set the image array
+void CImagePrintAppUi::SetImageArrayL( CDesCArrayFlat* aFileArray )
+    {
+    iFiles = aFileArray;
+
+    // Sets default navipane text with no copies.     
+    SetNavipaneTextL( 1 );            
+        
+    iDoc->SetImageArrayL( aFileArray );
+    }
+
+// Get the image array
+CDesCArrayFlat* CImagePrintAppUi::GetImageArray()
+    {
+    return iFiles;
+    }
+
+// Get the document class
+CImagePrintDoc* CImagePrintAppUi::GetDocument()
+    {
+    return iDoc;
+    }
+
+TInt CImagePrintAppUi::GetAlbumCall()
+    {
+    return iAlbumCall;
+    }
+
+void CImagePrintAppUi::SetAlbumCall(TInt aAlbumCall)
+    {
+    iAlbumCall = aAlbumCall;
+    }
+
+void CImagePrintAppUi::SetValidImagesStatus( TBool aStatus )
+    {
+    iValidImages = aStatus;
+    }
+
+void CImagePrintAppUi::ChangeViewL( TInt aView )
+    {
+    switch( aView )
+        {	
+        case MUIModeObserver::SettingsView:
+            {
+            ActivateLocalViewL( KImageSettingsViewId );
+            break;
+            }
+        }
+    }
+
+void CImagePrintAppUi::ExitApplication()
+    {
+    Exit();
+    }
+
+
+TInt CImagePrintAppUi::GetAiwState()
+    {
+    return iAiwState;
+    }
+
+TBool CImagePrintAppUi::AiwState()
+    {
+    TBool retValue = EFalse;
+    if( iAiwState == EAiwPrintCall )
+        {
+        retValue = ETrue;
+        }
+    return retValue;
+    }
+
+
+// Files from AIW customer
+CDesCArrayFlat* CImagePrintAppUi::GetImagesFromAiwProviderL()
+    {
+	LOG("TBool CImagePrintAppUi::GetImagesFromAiwProvider() BEGIN");
+
+    RFs fileServer;
+    User::LeaveIfError(fileServer.Connect());
+    CleanupClosePushL( fileServer );
+    RFileReadStream readStream;
+    
+    TFileName paramFile;
+    CIMGPPrintUtils::GetDataFilePathL( paramFile );
+    
+    User::LeaveIfError( readStream.Open(fileServer, paramFile, EFileRead) );
+    readStream.PushL();
+    CAiwGenericParamList* paramList = CAiwGenericParamList::NewLC(readStream);
+
+    CDesCArrayFlat* imageFiles = new (ELeave) CDesCArrayFlat(5);
+
+	TBool noOtherFileTypes( EFalse );
+    TBool showFilesremovedNote ( EFalse );
+
+    TInt index( 0 );
+	const TAiwGenericParam* param = paramList->FindFirst(index,
+			EGenericParamFile,
+            EVariantTypeDesC);
+	while ( index != KErrNotFound )
+		{
+		TFileName filename( param->Value().AsDes() );
+		// CheckMIMEType needs to be changed so that we can distinguish between
+		// a) file not found b) file was incorrect MIME-type
+		noOtherFileTypes = CIMGPPrintUtils::CheckMIMEType( KJpegFileType, filename );
+		if ( noOtherFileTypes )
+			{
+			// check drm protection
+			CContent* content = NULL;
+			content = CContent::NewLC( filename );
+
+			TInt isDrmProtected( 0 );
+			TInt err = content->GetAttribute( EIsProtected, isDrmProtected );
+			CleanupStack::PopAndDestroy(); // content
+   		if ( err || isDrmProtected )
+    			{
+    			LOG("CImagePrintAppUi::GetImagesFromAiwProvider(): found drm file!");
+    			noOtherFileTypes = EFalse;
+    			}
+			}
+
+		if ( noOtherFileTypes )
+			{
+			imageFiles->AppendL( filename );
+			}
+        else
+            {
+            showFilesremovedNote = ETrue;
+		    }
+
+		param = paramList->FindNext(index,
+			EGenericParamFile,
+            EVariantTypeDesC);
+		}
+
+    if ( showFilesremovedNote )
+        {
+        CAknErrorNote* errornote = new (ELeave) CAknErrorNote( ETrue );
+		    HBufC* buf = StringLoader::LoadLC( R_QTN_PRINT_WRONGTYPE_NOTE );
+		    errornote->ExecuteLD( *buf );
+		    CleanupStack::PopAndDestroy( buf );
+        }
+    
+    // If only one image is selected to print and it's corrupted, exit from application.
+    if ( showFilesremovedNote && ( imageFiles->Count() == KErrNone ))
+    	{
+  		CAknErrorNote* errornote = new (ELeave) CAknErrorNote( ETrue );
+		HBufC* buf = StringLoader::LoadLC( R_QTN_PRINT_SELECTNEW_NOTE );
+		errornote->ExecuteLD( *buf );
+		CleanupStack::PopAndDestroy( buf );
+		Exit();
+    	}
+
+    CleanupStack::PopAndDestroy(paramList); //paramList
+
+    LOG("TBool CImagePrintAppUi::GetImagesFromAiwProvider() END");
+
+    readStream.Close();
+    readStream.Pop();
+    CleanupStack::PopAndDestroy( &fileServer );
+    return imageFiles;
+    }
+
+TBool CImagePrintAppUi::OrientationPortrait()
+    {
+    TBool retValue = ETrue;
+    TSize screenSize = CCoeEnv::Static()->ScreenDevice()->SizeInPixels();
+    if( screenSize.iWidth == 416 ||
+    	screenSize.iWidth == 320 )
+        {
+        retValue = EFalse;
+        }
+    return retValue;
+    }
+
+TBool CImagePrintAppUi::QVGAMode()
+    {
+    TBool retValue = EFalse;
+    TSize screenSize = CCoeEnv::Static()->ScreenDevice()->SizeInPixels();
+    if( screenSize.iWidth == 240 ||
+    	screenSize.iWidth == 320 )
+        {
+        retValue = ETrue;
+        }
+    return retValue;
+    }
+
+// Sets NaviPane text
+void CImagePrintAppUi::SetNavipaneTextL( const TInt aCopiesOfImage, HBufC* aPaperSize )
+	{	
+	// Navipane image count will be sum of all images on current print job.
+	// E.g. If 2 images selected and copies value is 2, navi value will be: 2 x 2 = 4.
+	TInt printCount = aCopiesOfImage * ( iFiles->MdcaCount() );
+    
+    // Buffer to store image or images -string.
+	HBufC* naviText;
+    
+    // If only one image to print navipane text will be: Image
+    if ( printCount == 1 )
+    	{    	
+    	naviText = StringLoader::LoadLC( R_PRINTJOB_IMAGE );
+		}
+    // If more than one image to print navipane text will be: Images
+	else 
+		{
+		naviText = StringLoader::LoadLC( R_PRINTJOB_IMAGES, printCount );
+		}  
+	
+    TInt strLength = naviText->Length();
+    
+    CEikStatusPane* sp =
+        iEikonEnv->AppUiFactory()->StatusPane();
+    CAknNavigationControlContainer* np =
+        static_cast<CAknNavigationControlContainer*>(
+            sp->ControlL( TUid::Uid( EEikStatusPaneUidNavi ) ) );
+    delete iNaviDecorator;
+    iNaviDecorator = NULL;
+
+    // If paper size needs to be added to the NaviPane, more space is needed
+    if( aPaperSize )
+        {
+        strLength += aPaperSize->Length() + KLineLength;
+        }
+    // Clear the printer name string from all formatting tabs & numbers
+	HBufC* stringholder = HBufC::NewLC( strLength );
+	*stringholder = *naviText;
+	TPtr ptr = stringholder->Des();
+	TInt pos = stringholder->Find( KTabChar );
+	if ( pos == 1 ) // 1st possible icon formatting tab is at pos 1
+		{
+		ptr.Delete( 0, 2 ); // delete the first icon tab and the number previous to it
+		pos = stringholder->Find( KTabChar );
+		}
+	// 2nd possible iconformatting tab is 2nd last char (len - 2), don't delete it here  		
+	while ( pos != KErrNotFound &&
+		    pos != stringholder->Length() - 2 )
+		{
+		ptr.Delete( pos, 1); // delete all middle tabs
+		pos = stringholder->Find( KTabChar );
+		}
+	// 2nd possible iconformatting tab is 2nd last char
+	if ( pos != KErrNotFound &&
+		 pos == stringholder->Length() - 2 )
+		{
+		// delete the 2nd icon formatting tab and the number next to it
+		ptr.Delete( stringholder->Length() - 2, 2 );
+		}
+
+    // Add paper size and '-', in the beginning of the text
+    if( aPaperSize )
+	    {
+        TPtr ptr2 = aPaperSize->Des();
+        ptr.Insert(0, KLine);
+        ptr.Insert(0, ptr2);
+	    }
+
+    iNaviDecorator = np->CreateNavigationLabelL( *stringholder );
+    CleanupStack::PopAndDestroy( stringholder );
+    np->PushL( *iNaviDecorator );
+    sp->DrawNow();
+    
+    CleanupStack::PopAndDestroy( naviText );
+    }
+
+TUid CImagePrintAppUi::GetSettingsViewUid()
+    {
+    return KImageSettingsViewId;
+    }
+
+// End of File