diff -r 159fc2f68139 -r d59c248c9d36 ImagePrint/ImagePrintEngine/ImagePrintServer/src/server/cimageprintsession.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/src/server/cimageprintsession.cpp Wed Sep 01 12:30:38 2010 +0100 @@ -0,0 +1,800 @@ +/* +* 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 "cimageprintsession.h" +#include "imageprintclientserver.h" +#include "cimageprintserver.h" +#include "clog.h" +#include "cimageprintbody.h" +#include "cserveridleguard.h" +#include "cserverdiscoveryguard.h" +#include "cserverjobguard.h" +#include "cnumofcopies.h" + +namespace + { + // panic + _LIT( KImagePrintSessionPanic, "CIPSes" ); + enum TImagePrintSessionPanic + { + ENotSupported + }; + + void PanicClient( const TMessageWrp2& aMessage, TImagePrintSessionPanic aCategory ) + { + aMessage.Panic( KImagePrintSessionPanic, aCategory ); + } + } + +CImagePrintSession::~CImagePrintSession() + { + LOG("CImagePrintSession::~CImagePrintSession begin"); + delete iNumOfCopies; + delete iIdleGuard; + delete iDiscoveryGuard; + delete iJobGuard; + iCapabilityIDs.Close(); + iMsgWrappers.ResetAndDestroy(); + iMsgWrappers.Close(); + Server().ReleaseEngine( this ); + Server().RemoveSession(); + LOG("CImagePrintSession::~CImagePrintSession end"); + } + +CImagePrintServer& CImagePrintSession::Server() + { + return *static_cast( const_cast( CSession2::Server() ) ); + } + +void CImagePrintSession::CreateL() + { + LOG("CImagePrintSession::CreateL begin"); + Server().AddSession(); + iIdleGuard = CServerIdleGuard::NewL( Server().Engine() ); + iDiscoveryGuard = CServerDiscoveryGuard::NewL( Server().Engine() ); + iJobGuard = CServerJobGuard::NewL( Server().Engine() ); + iNumOfCopies = CNumOfCopies::NewL(); + iConnected = ETrue; + LOG("CImagePrintSession::CreateL end"); + } + +void CImagePrintSession::Disconnect(const RMessage2 &aMessage) + { + LOG("CImagePrintSession::Disconnect begin"); + Server().Engine().HandleSessionDisconnect( iIdleGuard, iDiscoveryGuard, iJobGuard ); + iConnected = EFalse; + CSession2::Disconnect( aMessage ); + LOG("CImagePrintSession::Disconnect end"); + } + +void CImagePrintSession::ServiceL( const RMessage2& aMessage ) + { + LOG1("CImagePrintSession::ServiceL aMessage.Function(): %d", aMessage.Function()); + + // wrapper array clean begin + TInt index = iMsgWrappers.Count(); + LOG1("CImagePrintSession::ServiceL index: %d", index); + TBool result( EFalse ); + while( --index >= 0 && !result ) + { + if( ( iMsgWrappers[index] )->Disposable() ) + { + TMessageWrp2* toDispose = iMsgWrappers[index]; + iMsgWrappers.Remove( index ); + delete toDispose; + toDispose = NULL; + result = ETrue; + } + } + // wrapper array clean end + + TMessageWrp2* msgWrapper = new (ELeave) TMessageWrp2( aMessage, iConnected ); + TInt err = iMsgWrappers.Insert( msgWrapper, 0 ); + if( err ) + { + delete msgWrapper; + User::Leave( err ); + } + else + { + msgWrapper = NULL; + } + + TInt messageIndex = aMessage.Function(); + + if ( messageIndex <= EContinuePrintJob ) + { + ServiceFirstPartL( messageIndex ); + } + else if ( messageIndex >= ERemoveCachedPrinter && messageIndex <= EGetPrinterCapHigh ) + { + ServiceSecondPartL( messageIndex ); + } + else if ( messageIndex >= EGetPrinterCapEnumCount && messageIndex <= ESetNumberOfCopies ) + { + ServiceThirdPartL ( messageIndex ); + } + else + { + PanicClient( *iMsgWrappers[0], ENotSupported ); + } + + LOG("CImagePrintSession::ServiceL end"); + } +void CImagePrintSession::ServiceFirstPartL( TInt aIndex ) + { + switch( aIndex ) + { + case ECountConnections: + CountConnectionsL( *iMsgWrappers[0] ); + break; + + case ESetForeground: + SetForegroundL( *iMsgWrappers[0] ); + break; + + case EReserveEngine: + ReserveEngine( *iMsgWrappers[0] ); + break; + + case EReleaseEngine: + ReleaseEngine( *iMsgWrappers[0] ); + break; + + case ESupportedProtocols: + SupportedProtocols( *iMsgWrappers[0] ); + break; + + case EGetNumPrintPages: + GetNumPrintPages( *iMsgWrappers[0] ); + break; + + case EGetJobStatus: + GetJobStatus( *iMsgWrappers[0] ); + break; + + case EGetPrinterStatus: + GetPrinterStatus( *iMsgWrappers[0] ); + break; + + case ECancelDiscovery: + CancelDiscovery( *iMsgWrappers[0] ); + break; + + case ESubmitPrintJob: + SubmitPrintJobL( *iMsgWrappers[0] ); + break; + + case ECancelPrintJob: + CancelPrintJob( *iMsgWrappers[0] ); + break; + + case EContinuePrintJob: + ContinuePrintJobL( *iMsgWrappers[0] ); + break; + + default: + LOG1("[CImagePrintSession::ServiceFirstPartL]\t Method reached to an end with index: %d", aIndex); + break; + } + } + +void CImagePrintSession::ServiceSecondPartL( TInt aIndex ) + { + switch( aIndex ) + { + case ERemoveCachedPrinter: + RemoveCachedPrinterL( *iMsgWrappers[0] ); + break; + + case EGetJobTemplateIcon: + GetJobTemplateIconL( *iMsgWrappers[0] ); + break; + + case EGetNumPreviewPages: + GetNumPreviewPages( *iMsgWrappers[0] ); + break; + + case ESetJobSetting: + SetJobSettingL( *iMsgWrappers[0] ); + break; + + case EGetJobSetting: + GetJobSettingL( *iMsgWrappers[0] ); + break; + + case EGetPrinterCapability: + GetPrinterCapabilityL( *iMsgWrappers[0] ); + break; + + case EGetPrinterCapId: + GetPrinterCapIdL( *iMsgWrappers[0] ); + break; + + case EGetPrinterCapType: + GetPrinterCapTypeL( *iMsgWrappers[0] ); + break; + + case EGetPrinterCapDef: + GetPrinterCapDefL( *iMsgWrappers[0] ); + break; + + case EGetPrinterCapLow: + GetPrinterCapLowL( *iMsgWrappers[0] ); + break; + + case EGetPrinterCapHigh: + GetPrinterCapHighL( *iMsgWrappers[0] ); + break; + + default: + LOG1("[CImagePrintSession::ServiceSecondPartL]\t Method reached to an end with index: %d", aIndex); + break; + } + } + +void CImagePrintSession::ServiceThirdPartL( TInt aIndex ) + { + switch( aIndex ) + { + case EGetPrinterCapEnumCount: + GetPrinterCapEnumCountL( *iMsgWrappers[0] ); + break; + + case EGetPrinterCapEnum: + GetPrinterCapEnumL( *iMsgWrappers[0] ); + break; + + case EGetPrinterCapabilityIDsCount: + GetPrinterCapabilityIDsCountL( *iMsgWrappers[0] ); + break; + + case EGetPrinterCapabilityID: + GetPrinterCapabilityIDL( *iMsgWrappers[0] ); + break; + + case ERegisterIdleObserver: + RegisterIdleObserverL( *iMsgWrappers[0] ); + break; + + case ECancelRegisterIdleObserver: + CancelRegisterIdleObserverL( *iMsgWrappers[0] ); + break; + + case EStartDiscovery: + StartDiscoveryL( *iMsgWrappers[0] ); + break; + + case EContinueDiscovery: + ContinueDiscoveryL( *iMsgWrappers[0] ); + break; + + case EPrepareJob: + PrepareJobL( *iMsgWrappers[0] ); + break; + + case ECreateJob: + CreateJobL( *iMsgWrappers[0] ); + break; + + case EContinueCreateJob: + ContinueCreateJobL( *iMsgWrappers[0] ); + break; + + case ECancelStartDiscovery: + CancelStartDiscoveryL( *iMsgWrappers[0] ); + break; + + case ECancelCreateJob: + CancelCreateJobL( *iMsgWrappers[0] ); + break; + + case EIsPictBridgeMode: + IsPictBridgeModeL( *iMsgWrappers[0] ); + break; + + case ESetNumberOfCopiesCount: + SetNumberOfCopiesCountL( *iMsgWrappers[0] ); + break; + + case ESetNumberOfCopies: + SetNumberOfCopiesL( *iMsgWrappers[0] ); + break; + + default: + LOG1("[CImagePrintSession::ServiceThirdPartL]\t Method reached to an end with index: %d", aIndex); + break; + } + } + + +void CImagePrintSession::CountConnectionsL( TMessageWrp2& aMessage ) + { + TInt count = Server().SessionCount(); + TPckgC countDes( count ); + aMessage.WriteL( 0, countDes ); + aMessage.SetDisposable( ETrue ); + aMessage.Complete( KErrNone ); + } + +void CImagePrintSession::SetForegroundL( TMessageWrp2& aMessage ) + { + TInt fg = aMessage.Int0(); + aMessage.SetDisposable( ETrue ); + aMessage.Complete( KErrNone ); + } + +void CImagePrintSession::ReserveEngine( TMessageWrp2& aMessage ) + { + TInt err = Server().ReserveEngine( this ); + aMessage.SetDisposable( ETrue ); + aMessage.Complete( err ); + } + +void CImagePrintSession::ReleaseEngine( TMessageWrp2& aMessage ) + { + TInt err = Server().ReleaseEngine( this ); + aMessage.SetDisposable( ETrue ); + aMessage.Complete( err ); + } + +void CImagePrintSession::SupportedProtocols( TMessageWrp2& aMessage ) + { + TInt err = Server().ReserveEngine( this ); + aMessage.SetDisposable( ETrue ); + if( !err ) + { + TInt protocols = Server().Engine().SupportedProtocols(); + aMessage.Complete( protocols ); + } + else + { + aMessage.Complete( err ); + } + } + +void CImagePrintSession::GetNumPrintPages( TMessageWrp2& aMessage ) +{ + TInt err = Server().ReserveEngine( this ); + aMessage.SetDisposable( ETrue ); + if( !err ) + { + TInt pages = Server().Engine().GetNumPrintPages(); + aMessage.Complete( pages ); + } + else + { + aMessage.Complete( err ); + } + } + +void CImagePrintSession::GetJobStatus( TMessageWrp2& aMessage ) +{ + TInt err = Server().ReserveEngine( this ); + aMessage.SetDisposable( ETrue ); + if( !err ) + { + TInt status = Server().Engine().GetJobStatus(); + aMessage.Complete( status ); + } + else + { + aMessage.Complete( err ); + } + } + +void CImagePrintSession::GetPrinterStatus( TMessageWrp2& aMessage ) +{ + TInt err = Server().ReserveEngine( this ); + aMessage.SetDisposable( ETrue ); + if( !err ) + { + TInt id = aMessage.Int0(); + TInt status = Server().Engine().GetPrinterStatus( id ); + aMessage.Complete( status ); + } + else + { + aMessage.Complete( err ); + } + } + +void CImagePrintSession::CancelDiscovery( TMessageWrp2& aMessage ) + { + TInt err = Server().ReserveEngine( this ); + if( !err ) + { + Server().Engine().CancelDiscovery(); + } + aMessage.SetDisposable( ETrue ); + aMessage.Complete( err ); + } + +void CImagePrintSession::SubmitPrintJobL( TMessageWrp2& aMessage ) + { + TInt err = Server().ReserveEngine( this ); + if( !err ) + { + Server().Engine().SubmitPrintJobL(); + } + aMessage.SetDisposable( ETrue ); + aMessage.Complete( err ); + } + +void CImagePrintSession::CancelPrintJob( TMessageWrp2& aMessage ) + { + TInt err = Server().ReserveEngine( this ); + if( !err ) + { + err = Server().Engine().CancelPrintJob(); + } + aMessage.SetDisposable( ETrue ); + aMessage.Complete( err ); + } + +void CImagePrintSession::ContinuePrintJobL( TMessageWrp2& aMessage ) + { + TInt err = Server().ReserveEngine( this ); + if( !err ) + { + err = Server().Engine().ContinuePrintJobL(); + } + aMessage.SetDisposable( ETrue ); + aMessage.Complete( err ); + } + +void CImagePrintSession::RemoveCachedPrinterL( TMessageWrp2& aMessage ) + { + TInt err = Server().ReserveEngine( this ); + if( !err ) + { + TInt id = aMessage.Int0(); + err = Server().Engine().RemoveCachedPrinterL( id ); + } + aMessage.SetDisposable( ETrue ); + aMessage.Complete( err ); + } + +void CImagePrintSession::GetJobTemplateIconL( TMessageWrp2& aMessage ) + { + TInt err = Server().ReserveEngine( this ); + if( !err ) + { + TInt id = aMessage.Int0(); + TInt handle; + err = Server().Engine().GetJobTemplateIconL( id, handle ); + TPckgC handleDes( handle ); + aMessage.WriteL( 1, handleDes ); + } + aMessage.SetDisposable( ETrue ); + aMessage.Complete( err ); + } + +void CImagePrintSession::GetNumPreviewPages( TMessageWrp2& aMessage ) + { + TInt err = Server().ReserveEngine( this ); + aMessage.SetDisposable( ETrue ); + if( !err ) + { + TInt num = Server().Engine().GetNumPreviewPages(); + aMessage.Complete( num ); + } + else + { + aMessage.Complete( err ); + } + } + +void CImagePrintSession::SetJobSettingL( TMessageWrp2& aMessage ) + { + TInt err = Server().ReserveEngine( this ); + if( !err ) + { + TInt capabilityID = aMessage.Int0(); + TInt value = aMessage.Int1(); + TInt affectedCapability; + + LOG2("CImagePrintSession::SetJobSettingL || capabilityID = %d, value = %d", capabilityID, value ); + + err = Server().Engine().SetJobSettingL( capabilityID, value, affectedCapability ); + TPckgC affectedCapabilityDes( affectedCapability ); + aMessage.WriteL( 2, affectedCapabilityDes ); + } + aMessage.SetDisposable( ETrue ); + aMessage.Complete( err ); + } + +void CImagePrintSession::GetJobSettingL( TMessageWrp2& aMessage ) + { + TInt err = Server().ReserveEngine( this ); + if( !err ) + { + TInt capabilityID = aMessage.Int0(); + TInt value; + err = Server().Engine().GetJobSetting( capabilityID, value ); + TPckgC valueDes( value ); + aMessage.WriteL( 1, valueDes ); + } + aMessage.SetDisposable( ETrue ); + aMessage.Complete( err ); + } + +void CImagePrintSession::GetPrinterCapabilityL( TMessageWrp2& aMessage ) + { + TInt err = Server().ReserveEngine( this ); + if( !err ) + { + TInt printerID = aMessage.Int0(); + TInt capabilityID = aMessage.Int1(); + err = Server().Engine().GetPrinterCapabilityL( printerID, capabilityID, iCapability ); + } + aMessage.SetDisposable( ETrue ); + aMessage.Complete( err ); + } + +void CImagePrintSession::GetPrinterCapIdL( TMessageWrp2& aMessage ) + { + TInt err = Server().ReserveEngine( this ); + if( !err ) + { + TPckgC capIdDes( iCapability.iCapabilityID ); + aMessage.WriteL( 0, capIdDes ); + } + aMessage.SetDisposable( ETrue ); + aMessage.Complete( err ); + } + +void CImagePrintSession::GetPrinterCapTypeL( TMessageWrp2& aMessage ) + { + TInt err = Server().ReserveEngine( this ); + if( !err ) + { + TPckgC typeDes( iCapability.iType ); + aMessage.WriteL( 0, typeDes ); + } + aMessage.SetDisposable( ETrue ); + aMessage.Complete( err ); + } + +void CImagePrintSession::GetPrinterCapDefL( TMessageWrp2& aMessage ) + { + TInt err = Server().ReserveEngine( this ); + if( !err ) + { + TPckgC defDes( iCapability.iDefaultValue ); + aMessage.WriteL( 0, defDes ); + } + aMessage.SetDisposable( ETrue ); + aMessage.Complete( err ); + } + +void CImagePrintSession::GetPrinterCapLowL( TMessageWrp2& aMessage ) + { + TInt err = Server().ReserveEngine( this ); + if( !err ) + { + TPckgC lowDes( iCapability.iLow ); + aMessage.WriteL( 0, lowDes ); + } + aMessage.SetDisposable( ETrue ); + aMessage.Complete( err ); + } + +void CImagePrintSession::GetPrinterCapHighL( TMessageWrp2& aMessage ) + { + TInt err = Server().ReserveEngine( this ); + if( !err ) + { + TPckgC highDes( iCapability.iHigh ); + aMessage.WriteL( 0, highDes ); + } + aMessage.SetDisposable( ETrue ); + aMessage.Complete( err ); + } + +void CImagePrintSession::GetPrinterCapEnumCountL( TMessageWrp2& aMessage ) + { + TInt err = Server().ReserveEngine( this ); + if( !err ) + { + TPckgC countDes( iCapability.iEnumCount ); + aMessage.WriteL( 0, countDes ); + } + aMessage.SetDisposable( ETrue ); + aMessage.Complete( err ); + } + +void CImagePrintSession::GetPrinterCapEnumL( TMessageWrp2& aMessage ) + { + TInt err = Server().ReserveEngine( this ); + if( !err ) + { + TInt index = aMessage.Int0(); + TPckgC enumDes( iCapability.iEnumCodes[index] ); + aMessage.WriteL( 1, enumDes ); + } + aMessage.SetDisposable( ETrue ); + aMessage.Complete( err ); + } + + +void CImagePrintSession::GetPrinterCapabilityIDsCountL( TMessageWrp2& aMessage ) + { + TInt err = Server().ReserveEngine( this ); + if( !err ) + { + iCapabilityIDs.Reset(); + TInt printerID = aMessage.Int0(); + err = Server().Engine().GetPrinterCapabilityIDsL( printerID, iCapabilityIDs ); + if( !err ) + { + TInt count = iCapabilityIDs.Count(); + TPckgC countDes( count ); + aMessage.WriteL( 1, countDes ); + } + } + aMessage.SetDisposable( ETrue ); + aMessage.Complete( err ); + } + +void CImagePrintSession::GetPrinterCapabilityIDL( TMessageWrp2& aMessage ) + { + TInt err = Server().ReserveEngine( this ); + if( !err ) + { + TInt index = aMessage.Int0(); + TInt id = iCapabilityIDs[index]; + TPckgC idDes( id ); + aMessage.WriteL( 1, idDes ); + } + aMessage.SetDisposable( ETrue ); + aMessage.Complete( err ); + } + +void CImagePrintSession::RegisterIdleObserverL( TMessageWrp2& aMessage ) + { + iIdleGuard->Guard( aMessage ); + } + +void CImagePrintSession::CancelRegisterIdleObserverL( TMessageWrp2& aMessage ) + { + TInt err = Server().ReserveEngine( this ); + if( !err ) + { + iIdleGuard->Stop(); + } + aMessage.SetDisposable( ETrue ); + aMessage.Complete( err ); + } + +void CImagePrintSession::StartDiscoveryL( TMessageWrp2& aMessage ) + { + TInt err = iDiscoveryGuard->StartL( aMessage ); + aMessage.SetDisposable( ETrue ); + aMessage.Complete( err ); + } + +void CImagePrintSession::ContinueDiscoveryL( TMessageWrp2& aMessage ) + { + iDiscoveryGuard->ContinueL( aMessage ); + } + +void CImagePrintSession::PrepareJobL( TMessageWrp2& aMessage ) + { + iJobGuard->PrepareL( aMessage ); + aMessage.SetDisposable( ETrue ); + aMessage.Complete( KErrNone ); + } + +void CImagePrintSession::CreateJobL( TMessageWrp2& aMessage ) + { + TInt err = iJobGuard->CreateL( aMessage ); + aMessage.SetDisposable( ETrue ); + aMessage.Complete( err ); + } + +void CImagePrintSession::ContinueCreateJobL( TMessageWrp2& aMessage ) + { + iJobGuard->ContinueCreateL( aMessage ); + } + +void CImagePrintSession::CancelStartDiscoveryL( TMessageWrp2& aMessage ) + { + TInt err = Server().ReserveEngine( this ); + if( !err ) + { + iDiscoveryGuard->Stop(); + } + aMessage.SetDisposable( ETrue ); + aMessage.Complete( err ); + } + +void CImagePrintSession::CancelCreateJobL( TMessageWrp2& aMessage ) + { + TInt err = Server().ReserveEngine( this ); + if( !err ) + { + iJobGuard->Stop(); + } + aMessage.SetDisposable( ETrue ); + aMessage.Complete( err ); + } + +void CImagePrintSession::IsPictBridgeModeL( TMessageWrp2& aMessage ) + { + RUsb usbManager; + TUsbDeviceState dState; + TInt personality; + TInt err = EFalse; + User::LeaveIfError( usbManager.Connect()); + User::LeaveIfError( usbManager.GetDeviceState(dState)); + User::LeaveIfError( usbManager.GetCurrentPersonalityId(personality)); + usbManager.Close(); + + /* + * If there is some problems with pictbridge, check from usbpersonalityids.h that constants haven't been changed. + */ + if( dState == EUsbDeviceStateConfigured && + ((personality == KUsbPersonalityIdMTP)||(personality == KUsbPersonalityIdPCSuiteMTP))) + err = ETrue; + + aMessage.SetDisposable( ETrue ); + aMessage.Complete( err ); + } + +void CImagePrintSession::SetNumberOfCopiesCountL( TMessageWrp2& aMessage ) + { + LOG("CImagePrintSession::CheckNumberOfCopiesL begin"); + TInt count = aMessage.Int0(); + LOG1("CImagePrintSession::CheckNumberOfCopiesL count: %d", count); + TInt err = ( count > 0 ) ? KErrNone : KErrInvalidData; + if( !err ) + { + iNumOfCopies->Reset( count ); + } + LOG1("CImagePrintSession::CheckNumberOfCopiesL return: %d", err); + aMessage.SetDisposable( ETrue ); + aMessage.Complete( err ); + } + +void CImagePrintSession::SetNumberOfCopiesL( TMessageWrp2& aMessage ) + { + LOG("CImagePrintSession::SetNumberOfCopiesL begin"); + TInt copies = aMessage.Int0(); + LOG1("CImagePrintSession::SetNumberOfCopiesL copies: %d", copies); + TInt err = ( copies < 0 ) ? KErrInvalidData : KErrNone; + if( !err ) + { + TBool full; + iNumOfCopies->AddNumOfCopyL( copies, full ); + LOG1("CImagePrintSession::SetNumberOfCopiesL full: %d", full); + if( full ) + { + Server().Engine().SetNumsOfCopiesL( iNumOfCopies->NumsOfCopies(), err ); + } + } + LOG1("CImagePrintSession::SetNumberOfCopiesL return: %d", err); + aMessage.SetDisposable( ETrue ); + aMessage.Complete( err ); + } + +// End of File