ImagePrint/ImagePrintEngine/ImagePrintServer/src/server/cimageprintsession.cpp
changeset 0 d11fb78c4374
child 2 acc370d7f2f6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/src/server/cimageprintsession.cpp	Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,799 @@
+/*
+* 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 <usbman.h>
+#include <usbstates.h>
+#include <usbpersonalityids.h>
+
+#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<CImagePrintServer*>( const_cast<CServer2*>( 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<TInt> 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<TInt> 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<TInt> 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<TInt> 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<TInt> 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<TInt> 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<TInt> 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<TInt> 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<TInt> 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<TInt> 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<TInt> 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<TInt> 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<TInt> 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 )
+			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