--- /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