accessoryservices/pluggeddisplay/pluggeddisplayengine/src/accessoryconnectionif.cpp
changeset 0 4e1aa6a622a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/accessoryservices/pluggeddisplay/pluggeddisplayengine/src/accessoryconnectionif.cpp	Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,222 @@
+/*
+* Copyright (c) 2009 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:  Accessory Connection Interface class for Composite Cable Status FSM.
+*
+*/
+
+
+#include "accessoryconnectionif.h"
+#include "multifinitestatemachine.h"
+#include "pdeconstants.h"
+#include "trace.h"
+#include "compositecablestatusfsm.h"
+#include <AccessoryServer.h>
+#include <AccessoryConnection.h>
+#include <AsyCmdTypes.h>
+#include <AccPolCommonNameValuePairs.h>
+#include <AccPolSubblockNameArray.h>
+#include <e32cmn.h>
+
+// ======== LOCAL FUNCTIONS ========
+
+
+// ======== MEMBER FUNCTIONS ========
+
+
+// ---------------------------------------------------------------------------
+// Symbian two-phased constructor
+// ---------------------------------------------------------------------------
+//
+CAccessoryConnectionIf* CAccessoryConnectionIf::NewL(
+        MFSMForBody& aFSM,
+        RAccessoryServer& aAccessoryServer )
+    {
+    FUNC_LOG;
+    CAccessoryConnectionIf* self = new ( ELeave ) CAccessoryConnectionIf( aFSM );
+    CleanupStack::PushL( self );
+    self->ConstructL( aAccessoryServer );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CAccessoryConnectionIf::~CAccessoryConnectionIf()
+    {
+    FUNC_LOG;
+    Cancel();
+    iAccessoryConnection.CloseSubSession();
+    delete iAccPolGenericIDPtr;
+    }
+
+// ----------------------------------------------------------------------------
+// RunL
+//
+// ----------------------------------------------------------------------------
+//
+void CAccessoryConnectionIf::RunL()
+    {
+    FUNC_LOG;
+    TInt retVal( iStatus.Int() );
+    if ( retVal == KErrNone )  
+        {
+        TAccPolNameRecord nameRecord;
+        CAccPolSubblockNameArray* nameArray = CAccPolSubblockNameArray::NewL();
+        CleanupStack::PushL( nameArray );
+        
+        const TInt count = iGenericIDarray.Count();
+        
+        TBool accVideoOutCababiltyFound = EFalse;
+        for ( TInt index = 0; index < count; index++ )
+            {
+            //Get all supported capabilities for the connected accessory.
+            iAccessoryConnection.GetSubblockNameArrayL( 
+                              iGenericIDarray.GetGenericIDL( index ), 
+                              *nameArray );
+            
+            TAccPolGenericID genericID = iGenericIDarray.GetGenericIDL( index );
+            TBool wiredPC = genericID.PhysicalConnectionCaps( KPCWired );
+            TBool avDevice = genericID.DeviceTypeCaps( KDTAVDevice );
+            TBool videoOut = nameArray->HasName( KAccVideoOut );            
+            if( ( videoOut ) &&
+                ( wiredPC ) &&
+                ( avDevice ) )
+                {
+                nameRecord.SetName( KAccVideoOut );
+                TAccValueTypeTInt value;
+                if( iAccessoryConnection.GetValueL( genericID, nameRecord, value ) == KErrNone )
+                    {
+                    if( value.iValue == EAccVideoOutCVideo )
+                        {
+                        // Video/Composite cable is connected
+                        accVideoOutCababiltyFound = ETrue;
+                        TAccPolGenericID* genId = new (ELeave) TAccPolGenericID;
+                        CleanupStack::PushL( genId );
+                        *genId = genericID;
+                        iAccPolGenericIDPtr = genId;
+                        CleanupStack::Pop( genId );
+                        }
+                    }
+                }
+            }
+            
+            
+        // renew request for listening cable events
+        iAccessoryConnection.NotifyAccessoryConnectionStatusChanged ( iStatus, 
+                                                             iGenericIDarray );
+        SetActive();
+        if ( accVideoOutCababiltyFound )
+            {
+            // Video/Composite cable is connected
+            ((CCompositeCableStatusFSM*)&iFSM)->GetPDEngine()->Input( EPDEFSMIdCompositeCableStatus, EPDEIfAccessoryConnection, EPDEIfAccessoryConnectionEventCableConnected );
+            }
+        else
+            {
+            delete iAccPolGenericIDPtr;
+            iAccPolGenericIDPtr = NULL;
+            // Video/Composite cable is disconnected
+            ((CCompositeCableStatusFSM*)&iFSM)->GetPDEngine()->Input( EPDEFSMIdCompositeCableStatus, EPDEIfAccessoryConnection, EPDEIfAccessoryConnectionEventCableDisconnected );
+            }
+        CleanupStack::PopAndDestroy( nameArray );
+        }   
+    }
+
+// ----------------------------------------------------------------------------
+// DoCancel
+//
+// ----------------------------------------------------------------------------
+//
+void CAccessoryConnectionIf::DoCancel()
+    {
+    FUNC_LOG;
+    iAccessoryConnection.CancelGetAccessoryConnectionStatus();
+    iAccessoryConnection.CancelNotifyAccessoryConnectionStatusChanged();
+    }
+
+// ----------------------------------------------------------------------------
+// DoCancel
+//
+// ----------------------------------------------------------------------------
+//
+TInt CAccessoryConnectionIf::RunError( TInt aError )
+    {
+    FUNC_LOG;
+    // Make use of aError argument top get rid of compiler warning.
+    TInt error( aError );
+    if ( KErrNone != error )
+        {
+        INFO_1("Accessory Status request failed with error code: %d", error );
+        }
+    INFO("Issuing new request for accessory status");
+    iAccessoryConnection.NotifyAccessoryConnectionStatusChanged ( iStatus, 
+                                                             iGenericIDarray );
+    SetActive();
+    
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------
+// C++ constructor
+// ---------------------------------------------------------
+//
+CAccessoryConnectionIf::CAccessoryConnectionIf(
+        MFSMForBody& aFSM )
+    : CActive( CActive::EPriorityLow ),
+    iFSM( aFSM )
+    {
+    FUNC_LOG;
+    }
+
+// ---------------------------------------------------------------------------
+// GetAccPolGenericID
+// ---------------------------------------------------------------------------
+//
+TInt CAccessoryConnectionIf::GetAccPolGenericID( TAccPolGenericID& aAccPolGenericID )
+    {
+    FUNC_LOG;
+    TInt retVal( KErrNone );
+    if ( iAccPolGenericIDPtr )
+        {
+        aAccPolGenericID = *iAccPolGenericIDPtr;
+        }
+    else
+        {
+        retVal = KErrNotFound;
+        }
+    return retVal;
+    }
+
+// ---------------------------------------------------------
+// ConstructL
+// ---------------------------------------------------------
+//
+void CAccessoryConnectionIf::ConstructL(
+        RAccessoryServer& aAccessoryServer  )
+    {
+    FUNC_LOG;
+    CActiveScheduler::Add( this );
+    // Create subsession.
+    User::LeaveIfError( iAccessoryConnection.CreateSubSession ( aAccessoryServer ) );
+    // Get asynchronously cable connection status
+    iAccessoryConnection.GetAccessoryConnectionStatus ( 
+                                          iStatus, iGenericIDarray );
+    // Ready to run
+    SetActive();
+
+    }
+
+// ======== GLOBAL FUNCTIONS ========
+