diff -r 159fc2f68139 -r d59c248c9d36 ImagePrint/ImagePrintUI/imageprintapp/src/cimageprintappui.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ImagePrint/ImagePrintUI/imageprintapp/src/cimageprintappui.cpp Wed Sep 01 12:30:38 2010 +0100 @@ -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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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"); + // Add EAknSingleClickCompatible to BaseConstructL function parameter for single click event + BaseConstructL( EAknEnableSkin | EAppOrientationAutomatic | EAknEnableMSK | EAknSingleClickCompatible ); + + 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( 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( 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( + 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