mtpdataproviders/mtppictbridgedp/pictbridgeengine/src/dpsusbnotifier.cpp
branchRCL_3
changeset 19 0aa8cc770c8a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mtpdataproviders/mtppictbridgedp/pictbridgeengine/src/dpsusbnotifier.cpp	Tue Aug 31 16:03:15 2010 +0300
@@ -0,0 +1,329 @@
+/*
+* Copyright (c) 2006, 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:  This class implements functions of set mtp personality, the 
+*                notification of the MTP printer connection and the
+*				 notification of the MTP printer disconnection. 
+*
+*/
+
+
+#include <e32debug.h>
+#include <usbstates.h>
+#include <rptp.h>
+#include "dpsusbnotifier.h"
+#include "dpsconst.h"
+#include "dpsptpnotifier.h"
+#include "dpsconnectnotifier.h"
+
+#ifdef _DEBUG
+#	define IF_DEBUG(t) {RDebug::t;}
+#else
+#	define IF_DEBUG(t)
+#endif
+
+const TInt KUnknownPersonality = 0;
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+CDpsUsbNotifier* CDpsUsbNotifier::NewL(CDpsEngine* aEngine)
+	{
+	IF_DEBUG(Print(_L("CDpsUsbNotifier::NewL")));
+	CDpsUsbNotifier* self = new(ELeave) CDpsUsbNotifier(aEngine);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop();
+	return self;	
+	}
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+CDpsUsbNotifier::CDpsUsbNotifier(CDpsEngine* aEngine) :
+    CActive(EPriorityNormal), iEngine(aEngine), 
+    iPersonality(KUnknownPersonality), 
+    iConnectState(EUsbDeviceStateUndefined), iConfigured(EFalse), 
+    iConnection(CDpsEngine::ENotConnected), iRollback(EFalse)
+    {
+    IF_DEBUG(Print(_L(">>>CDpsUsbNotifier::Ctor")));
+    CActiveScheduler::Add(this);        
+    IF_DEBUG(Print(_L("<<<CDpsUsbNotifier::Ctor")));
+    }  
+  
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//	
+CDpsUsbNotifier::~CDpsUsbNotifier()
+	{
+	IF_DEBUG(Print(_L(">>>~CDpsUsbNotifier")));
+	Cancel();
+	Rollback();
+    delete iPtpP; iPtpP = NULL;
+    delete iConnectP; iConnectP = NULL;	
+    iUsbM.Close();
+    iUsbW.Close();
+    IF_DEBUG(Print(_L("<<<~CDpsUsbNotifier")));
+	}
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//	
+void CDpsUsbNotifier::ConstructL()
+    {
+    IF_DEBUG(Print(_L(">>>CDpsUsbNotifier::ConstructL")));
+    User::LeaveIfError(iUsbM.Connect());
+    User::LeaveIfError(iUsbW.Connect());
+    iPtpP = CDpsPtpNotifier::NewL(this);
+    iConnectP = CDpsConnectNotifier::NewL(this);
+    IF_DEBUG(Print(_L("<<<CDpsUsbNotifier::ConstructL")));
+    }    
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void CDpsUsbNotifier::WaitForPrinterNotify()
+    {
+    IF_DEBUG(Print(_L("CDpsUsbNotifier::WaitForPrinterNotify")));
+    iPtpP->ChangePtpPersonality();
+    }
+  
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//  
+void CDpsUsbNotifier::CancelPrinterNotify()
+    {
+    IF_DEBUG(Print(_L(">>>CDpsUsbNotifier::CancelPrinterNotify")));
+    if (CDpsEngine::ENotConnected == iConnection)
+        {
+        iPtpP->Cancel(); 
+        iConfigured = EFalse;    
+        }
+    else if (CDpsEngine::EPrinterConnected == iConnection)
+        {
+        iConnectP->Cancel();
+        }
+    // if the request is replied through RunL before the cancel
+    // iPrinterConnectRequest will be NULL and we don't need to cancel anything
+    if (iEngine->PrinterConnectRequest())
+        {
+	    User::RequestComplete(iEngine->PrinterConnectRequest(), KErrCancel);   
+        }    
+    IF_DEBUG(Print(_L("<<<CDpsUsbNotifier::CancelWaitForPrinterNotify")));
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void CDpsUsbNotifier::ConnectNotify()
+    {
+    IF_DEBUG(Print(_L(">>>CDpsUsbNotifier::ConnectNotify")));
+    iConnectP->ConnectNotify();
+    IF_DEBUG(Print(_L("<<<CDpsUsbNotifier::ConnectNotify")));
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//	
+void CDpsUsbNotifier::Rollback()
+    {
+    IF_DEBUG(Print(_L(">>>CDpsUsbNotifier::Rollback")));
+    // only when the personality has changed, we switch back to the previous
+    // personality
+    if (iPersonality)
+        {
+        TInt personalityId = KUsbPersonalityIdMTP;
+        iUsbM.GetCurrentPersonalityId(personalityId);
+        IF_DEBUG(Print(_L("CDpsUsbNotifier::Rollback, current personality= %d"), personalityId));
+        if(KUsbPersonalityIdPCSuiteMTP != personalityId)
+            {
+            if (!iConfigured || iRollback)
+                {
+                iUsbW.SetPreviousPersonality();
+                }
+            else
+                {
+                iUsbW.SetPreviousPersonalityOnDisconnect();
+                }
+            }
+        }
+    IF_DEBUG(Print(_L("<<<CDpsUsbNotifier::Rollback")));
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void CDpsUsbNotifier::PtpNotify(TInt aErr)
+    {
+    IF_DEBUG(Print(_L(">>>CDpsUsbNotifier::PtpNotify %x %d"), 
+        iConnectState, aErr));
+    if (aErr == KErrNone)
+        {
+        // personality changed to MTP, but cable is not connected        
+        if (iConnectState != EUsbDeviceStateUndefined)
+            {
+            if (!IsActive())
+                {
+                iEngine->Ptp().IsDpsPrinter(iStatus);
+                SetActive();    
+                }
+            }
+        else
+            {
+            iConnection = CDpsEngine::ENotConnected;
+            User::RequestComplete(iEngine->PrinterConnectRequest(), iConnection);
+            }    
+        }
+    else
+        {
+        iConnection = CDpsEngine::EWrongPrintModeConnected;
+        User::RequestComplete(iEngine->PrinterConnectRequest(), iConnection); 
+        }
+        	
+    IF_DEBUG(Print(_L("<<<CDpsUsbNotifier::PtpNotify")));        
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//    
+void CDpsUsbNotifier::PersonalityChanged()
+    {
+    IF_DEBUG(Print(_L(">>>CDpsUsbNotifier::PersonalityChanged %x"), 
+                                                              iPersonality));     
+    if (iPersonality != KUsbPersonalityIdMTP)
+        {
+        iConnection = CDpsEngine::EWrongPrintModeConnected;
+        iConfigured = EFalse;
+        if (iEngine->PrinterConnectRequest())
+            {
+            User::RequestComplete(iEngine->PrinterConnectRequest(), 
+                iConnection);     
+            }
+        }
+    // when UI gets this notification, it must quit. As the result, the dps 
+    // engine will be deleted so we do not need to care the further change.
+    
+    IF_DEBUG(Print(_L(">>>CDpsUsbNotifier::PersonalityChanged ")));     
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//    
+void CDpsUsbNotifier::RunL()
+    {
+    IF_DEBUG(Print(_L(">>>CDpsUsbNotifier::RunL")));
+    
+    if (EPrinterAvailable == iStatus.Int())
+        {
+        iConnection = CDpsEngine::EPrinterConnected;
+        iConfigured = ETrue;	
+        iEngine->SetDpsFolder(iEngine->Ptp().PtpFolder());			            
+        }
+    else if (iStatus.Int() != KErrCancel)
+        {
+        iConnection = CDpsEngine::EOtherConnected;
+        }
+    User::RequestComplete(iEngine->PrinterConnectRequest(), iConnection);    
+        
+    IF_DEBUG(Print(_L("<<<CDpsUsbNotifier::RunL")));
+    }
+    
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//       
+void CDpsUsbNotifier::DoCancel()
+    {
+    IF_DEBUG(Print(_L(">>>CDpsUsbNotifier::DoCancel")));
+    iEngine->Ptp().CancelIsDpsPrinter();
+    IF_DEBUG(Print(_L(">>>CDpsUsbNotifier::DoCancel")));
+    }
+    
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//       
+TInt CDpsUsbNotifier::RunError(TInt aErr)
+    {
+    IF_DEBUG(Print(_L("CDpsUsbNotifier::RunError is %d"), aErr));
+    return aErr;
+    }
+    
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//    
+void CDpsUsbNotifier::DisconnectNotify(TUsbDeviceState aState)
+    {
+    IF_DEBUG(Print(_L(">>>CDpsUsbNotifier::DisconnectNotify %d"), aState));
+    if (iConfigured)
+        {
+        iConnection = CDpsEngine::EPrinterDisconnected;
+        }
+    else
+        {
+        iConnection = CDpsEngine::ENotConnected;
+        }
+    iConfigured = EFalse;
+    if (EUsbDeviceStateUndefined == aState)
+        {
+        iRollback = ETrue;
+        }
+    if (iEngine->PrinterConnectRequest())
+        {
+        User::RequestComplete(iEngine->PrinterConnectRequest(), iConnection);    
+        }
+    
+    IF_DEBUG(Print(_L("<<<CDpsUsbNotifier::DisconnectNotify")));
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+TInt CDpsUsbNotifier::ConnectState()
+    {
+    IF_DEBUG(Print(_L(">>>CDpsUsbNotifier::ConnectState")));    
+    TInt ret = iUsbM.GetDeviceState(iConnectState);
+	IF_DEBUG(Print(_L("<<<CDpsUsbNotifier::ConnectState %x"), iConnectState));    
+	return ret;    
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+TBool CDpsUsbNotifier::IsSetPrintModeIssued()
+    {
+    return (iPersonality != KUnknownPersonality);
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+TBool CDpsUsbNotifier::IsConfigured() const
+    {
+    return iConfigured;
+    }