wim/WimServer/src/WimBTSapObserver.cpp
changeset 0 164170e6151a
child 16 9971b621ef6c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wim/WimServer/src/WimBTSapObserver.cpp	Tue Jan 26 15:20:08 2010 +0200
@@ -0,0 +1,200 @@
+/*
+* Copyright (c) 2005 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:  Observes the state of Bluetooth Sap. When the state is
+*               changed into connected, connection to smart card is closed and
+*               when the state is changed into not connected, initialize
+*               connection to smart card back.
+*
+*/
+
+
+
+// INCLUDE FILES
+#include    "WimBTSapObserver.h"
+#include    "WimServer.h"
+#include    "WimSession.h"
+#include    "WimTrace.h"
+
+#if defined BT_SAP_TEST_BY_CHARGER
+#include    <PSVariables.h>
+#else
+//#include    <BTSapInternalPSKeys.h>         // Property values
+#include    <BTSapDomainPSKeys.h>
+#endif // BT_SAP_TEST_BY_CHARGER
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CWimBTSapObserver::CWimBTSapObserver
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CWimBTSapObserver::CWimBTSapObserver()
+    : CActive( EPriorityNormal )
+    {
+    _WIMTRACE(_L("WIM|CWimBTSapObserver::CWimBTSapObserver|Begin"));
+    CActiveScheduler::Add( this );
+    }
+
+// -----------------------------------------------------------------------------
+// CWimBTSapObserver::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CWimBTSapObserver::ConstructL()
+    {
+    _WIMTRACE(_L("WIM|CWimBTSapObserver::ConstructL|Begin"));
+    iWimSvr = CWimServer::Server();
+    }
+
+// -----------------------------------------------------------------------------
+// CWimBTSapObserver::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CWimBTSapObserver* CWimBTSapObserver::NewL()
+    {
+    _WIMTRACE(_L("WIM|CWimBTSapObserver::NewL|Begin"));
+    CWimBTSapObserver* self = new( ELeave ) CWimBTSapObserver ();
+    
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+    
+// Destructor
+CWimBTSapObserver::~CWimBTSapObserver()
+    {
+    _WIMTRACE(_L("WIM|CWimBTSapObserver::~CWimBTSapObserver|Begin"));
+    Cancel();
+    iProperty.Close();
+    }
+
+// -----------------------------------------------------------------------------
+// CWimBTSapObserver::Start
+// Start listening publish and subscribe events
+// -----------------------------------------------------------------------------
+//
+void CWimBTSapObserver::Start()
+    {
+    _WIMTRACE(_L("WIM|CWimBTSapObserver::Start|Begin"));
+    if ( !IsActive() ) // If already active, don't activate
+        {
+        StartListening(); //Start listening
+        }    
+    }
+
+// -----------------------------------------------------------------------------
+// CWimBTSapObserver::StartListening
+// Start listening card status from publish and subscribe
+// -----------------------------------------------------------------------------
+//
+void CWimBTSapObserver::StartListening()
+    {
+    _WIMTRACE(_L("WIM|CWimBTSapObserver::StartListening|Begin"));
+    iStatus = KRequestPending;
+#if defined BT_SAP_TEST_BY_CHARGER
+    TInt err = iProperty.Attach( KUidSystemCategory, 
+                                 KPSUidChargerStatusValue );
+ 
+#else
+    TInt err = iProperty.Attach( KPSUidBluetoothSapConnectionState,
+                                 KBTSapConnectionState );
+#endif // BT_SAP_TEST_BY_CHARGER
+    if ( err == KErrNone )
+        {
+        iProperty.Subscribe( iStatus );
+        SetActive();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CWimBTSapObserver::RunL
+// Got event from publish and subscribe
+// -----------------------------------------------------------------------------
+//
+void CWimBTSapObserver::RunL()
+    {
+    _WIMTRACE(_L("WIM|CWimBTSapObserver::RunL|Begin"));
+    //Notify on bluetooth event
+    TInt btState;
+    iProperty.Get( btState );
+    switch ( btState )
+        {
+#if defined BT_SAP_TEST_BY_CHARGER
+        case EPSChargerStatusUninitialized: // Flow through
+        case EPSChargerDisconnected:        // Flow through
+        case EPSChargerNotCharging: // Charger not charging, no actions
+#else
+        case EBTSapNotConnected:    // Flow through
+        case EBTSapConnecting:      // BT Sap not connected, no actions
+#endif // BT_SAP_TEST_BY_CHARGER
+            {
+            StartListening();
+            break;
+            }
+#if defined BT_SAP_TEST_BY_CHARGER
+        case EPSChargerConnected:
+#else
+        case EBTSapConnected:
+#endif // BT_SAP_TEST_BY_CHARGER
+            {
+            if ( CWimServer::iWimInitialized )
+                {
+                // Wim initialized, can close WIMI immediately.
+                // NOTE: Is it ok to run lengthy operations here?
+                RArray<CWimSession*> sessions;
+                TRAPD( err, iWimSvr->GetSessionsL( sessions ) );
+
+                if ( !err )  // Got sessions correctly
+                    {
+                    // Loop through all sessions and notify all clients that are
+                    // requesting the notification
+                    for ( TInt i( 0 ); i < sessions.Count(); i++ )
+                        {
+                        sessions[i]->NotifyComplete();
+                        }
+                    sessions.Reset();
+                    // Close WIMI
+                    WIMI_CloseDownReq();
+                    _WIMTRACE(_L("WIM | CWimSatRefreshObserver::Refresh | WIMI closed."));
+                    }
+                }
+            else
+                {
+                _WIMTRACE(_L("WIM | CWimSatRefreshObserver::Refresh | WIMI already closed."));
+                }
+            }
+        }
+    _WIMTRACE(_L("WIM|CWimBTSapObserver::RunL|End"));
+    }
+
+// -----------------------------------------------------------------------------
+// CWimBTSapObserver::DoCancel
+// Cancel asynchronous request
+// -----------------------------------------------------------------------------
+//
+void CWimBTSapObserver::DoCancel()
+    {
+    _WIMTRACE(_L("WIM|CWimBTSapObserver::DoCancel|Begin"));
+    iProperty.Cancel();
+     _WIMTRACE(_L("WIM|CWimBTSapObserver::DoCancel|End"));
+    }
+
+//  End of File