connectionutilities/ConnectionDialogs/cconndlg/src/ActiveSelectExplicit.cpp
branchRCL_3
changeset 58 83ca720e2b9a
parent 0 5a93021fdf25
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/connectionutilities/ConnectionDialogs/cconndlg/src/ActiveSelectExplicit.cpp	Wed Sep 01 12:23:51 2010 +0100
@@ -0,0 +1,519 @@
+/*
+* Copyright (c) 2002 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:  Implementation of plugins (base & all derived).
+*
+*/
+
+
+// INCLUDE FILES
+#include "ActiveSelectExplicit.h"
+#include "SelectExplicitDialog.h"
+#include "ConnectionInfo.h"
+#include "ConnectionInfoArray.h"
+#include "CConnDlgPrivateCRKeys.h"
+#include "ConnectionDialogsLogger.h"
+#include "sortsnaputils.h"
+
+#include <commdb.h>
+#include <StringLoader.h>
+#include <wlanmgmtcommon.h>
+#include <cmdestinationext.h>
+#include <cmpluginwlandef.h>
+#ifndef __WINS__
+#include <wlanmgmtclient.h>
+#endif
+#include <AknWaitDialog.h>
+#include <AknIconArray.h>
+#include <AknsUtils.h>
+
+#include <CConnDlgPlugin.rsg>
+#include <data_caging_path_literals.hrh>
+#include <cmmanager.mbg>
+#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <commsdat.h>
+#else
+#include <commsdat.h>
+#include <commsdat_partner.h>
+#endif
+#include <wlancontainer.h>
+
+
+// CONSTANTS
+
+LOCAL_D const TInt KMaxEntryLength = CommsDat::KMaxTextLength*2 + 20;
+LOCAL_D const TInt KIconsGranularity = 4;
+
+using namespace CMManager;
+
+
+///////////////////////////////////////////////////////////////////////////////
+
+// ---------------------------------------------------------
+// CActiveSelectExplicit::CActiveSelectExplicit()
+// ---------------------------------------------------------
+//
+CActiveSelectExplicit::CActiveSelectExplicit( 
+                                        CSelectConnectionDialog* aCallerDialog,
+                                        TUint aDestId, 
+                                        TInt aRefreshInterval,
+                                        TUint32 aBearerSet, 
+                                        TBool aIsWLANFeatureSupported, 
+                                        TUint aDefaultCMId )
+: iCallerDialog( aCallerDialog ),
+  iDestId( aDestId ),
+//  isDialogDeleting( EFalse ),
+  iRefreshInterval( aRefreshInterval ),
+  iBearerSet( aBearerSet ),
+  iIsWLANFeatureSupported( aIsWLANFeatureSupported ), 
+  iDefaultCMId( aDefaultCMId )
+    {
+    }
+
+    
+// ---------------------------------------------------------
+// CActiveSelectExplicit* CActiveSelectExplicit::NewL()
+// ---------------------------------------------------------
+//
+CActiveSelectExplicit* CActiveSelectExplicit::NewL( 
+                                        CSelectConnectionDialog* aCallerDialog,
+                                        TUint aDestId, 
+                                        TInt aRefreshInterval,
+                                        TUint32 aBearerSet, 
+                                        TBool aIsWLANFeatureSupported, 
+                                        TUint aDefaultCMId )
+    {
+    CLOG_ENTERFN( "CActiveSelectExplicit::NewL " );  
+    
+    CActiveSelectExplicit* self = new ( ELeave ) CActiveSelectExplicit(
+                                    aCallerDialog, aDestId, aRefreshInterval,
+                                    aBearerSet, aIsWLANFeatureSupported, 
+                                    aDefaultCMId );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    
+    CLOG_LEAVEFN( "CActiveSelectExplicit::NewL " );      
+
+    return self;        
+    }
+
+
+// ---------------------------------------------------------
+// CActiveSelectExplicit::ConstructL()
+// ---------------------------------------------------------
+//
+void CActiveSelectExplicit::ConstructL()
+    {
+    CActiveBase::ConstructL();
+
+    iItems = new( ELeave ) CConnectionInfoArray();
+    iIcons = new( ELeave ) CAknIconArray( KIconsGranularity );
+
+    iCmManagerExt.OpenL();
+    }
+
+// ---------------------------------------------------------
+// CActiveSelectExplicit::~CActiveSelectExplicit()
+// ---------------------------------------------------------
+//    
+CActiveSelectExplicit::~CActiveSelectExplicit()
+    {
+    Cancel();
+
+    if ( iItems )
+        {
+        iItems->ResetAndDestroy();
+        }
+    delete iItems;    
+    iItems = NULL;
+
+    iCmManagerExt.Close();
+    }
+
+
+// ---------------------------------------------------------
+// CActiveSelectExplicit::Cancel()
+// ---------------------------------------------------------
+// 
+void CActiveSelectExplicit::Cancel()
+    {
+    StopTimer();
+    CActive::Cancel();
+
+    if( iDialog  && !( iDialog->GetOkToExit() ) )
+        {
+        CLOG_WRITEF( _L( "iDialog->GetOkToExit() : %b" ), iDialog->GetOkToExit() );
+        delete iDialog;
+        iDialog = NULL;
+        }
+    }
+
+
+// ---------------------------------------------------------
+// CActiveSelectExplicit::DoCancel()
+// ---------------------------------------------------------
+// 
+void CActiveSelectExplicit::DoCancel()
+    {
+    CLOG_ENTERFN( "CActiveSelectExplicit::DoCancel " );  
+    
+/*    if( isDialogDeleting )
+        {
+        CLOG_WRITE( "isDialogDeleting" );
+        
+        delete iDialog;
+        iDialog = NULL;   
+        
+        isDialogDeleting = EFalse;         
+        }
+  */      
+    CLOG_LEAVEFN( "CActiveSelectExplicit::DoCancel " );          
+    }
+
+    
+// ---------------------------------------------------------
+// CActiveSelectExplicit::RunL()
+// ---------------------------------------------------------
+//     
+void CActiveSelectExplicit::RunL()
+    {
+    CLOG_ENTERFN( "CActiveSelectExplicit::RunL " );  
+    
+    if( iStatus == KErrNone )
+        {
+        BuildConnectionListL();
+        iDialog->RefreshDialogL( iItems, iIcons, ETrue );
+        }     
+    
+    CLOG_LEAVEFN( "CActiveSelectExplicit::RunL " );      
+        
+    }
+
+    
+// ---------------------------------------------------------
+// CActiveSelectExplicit::StartSearchIAPsL()
+// ---------------------------------------------------------
+//    
+void CActiveSelectExplicit::ShowSelectExplicitL()
+    {    
+    BuildConnectionListL();
+
+    iDialog = CSelectExplicitDialog::NewL( iCallerDialog );
+    iDialog->PrepareAndRunLD( iItems, iIcons, EFalse );
+
+    if( iRefreshInterval )
+        {
+        StartTimerL( iRefreshInterval );
+        }     
+    }
+   
+ 
+// ---------------------------------------------------------
+// CActiveSelectExplicit::BuildConnectionListL()
+// ---------------------------------------------------------
+//
+void CActiveSelectExplicit::BuildConnectionListL()
+    {
+    CLOG_ENTERFN( "CActiveSelectExplicit::BuildConnectionListL " );  
+
+    if ( iItems )
+        {
+        iItems->ResetAndDestroy();
+        }
+
+    if ( iIcons )
+        {
+        iIcons->ResetAndDestroy();
+        }
+
+    if ( iDefaultCMId != 0 )  
+        {   // It automatically means also that the feature is supported
+        _LIT( KDriveZ, "z:" );  // ROM folder
+        // Name of the MBM file containing icons
+        _LIT( KManagerIconFilename, "cmmanager.mbm" );
+    
+        TFileName iconsFileName;
+
+        iconsFileName.Append( KDriveZ );
+        iconsFileName.Append( KDC_APP_BITMAP_DIR );
+        iconsFileName.Append( KManagerIconFilename );
+
+        iIcons->AppendL( AknsUtils::CreateGulIconL( AknsUtils::SkinInstance(),
+                                    KAknsIIDQgnIndiCbHotAdd,
+                                    iconsFileName, 
+                                    EMbmCmmanagerQgn_indi_cb_hot_add, 
+                                    EMbmCmmanagerQgn_indi_cb_hot_add_mask ) );
+        }
+
+    TBool easyWlanIsInDb = EFalse;
+
+#ifdef _DEBUG
+    if ( iDestId )
+        {   // Real destination, not for uncategorized
+        RCmDestinationExt cmDestExt = iCmManagerExt.DestinationL( iDestId );
+        CleanupClosePushL( cmDestExt );
+        CLOG_WRITEF( _L( "Destination id %d, Total number of methods %d" ),
+                    iDestId, cmDestExt.ConnectionMethodCount() );
+
+        for ( TInt j = 0; j < cmDestExt.ConnectionMethodCount(); j++ )
+            {
+            RCmConnectionMethodExt cmConnMethodExt;
+            TRAPD( err, cmConnMethodExt = cmDestExt.ConnectionMethodL( j ) );
+            if ( err == KErrNone )
+                {
+                CleanupClosePushL( cmConnMethodExt );
+                HBufC* bufMethod = cmConnMethodExt.GetStringAttributeL(
+                                                                    ECmName );
+                CleanupStack::PushL( bufMethod );
+                TBuf<CommsDat::KMaxTextLength+1> nameMethod;
+                nameMethod = *bufMethod;
+                nameMethod.ZeroTerminate();
+
+                CLOG_WRITEF( _L( "ConnMethod id %d, Method name %s" ), 
+                    cmConnMethodExt.GetIntAttributeL( ECmIapId ), nameMethod.Ptr() );
+
+                CleanupStack::PopAndDestroy( 2 ); // bufMethod, cmConnMethodExt
+                }
+            }
+        CleanupStack::PopAndDestroy();  // cmDestExt
+        }
+#endif
+        TSortSnapUtils sortSnapUtils( iMPM );
+        TMpmSnapBuffer snapBuffer;
+        TInt err = sortSnapUtils.GetSortSnapData( iDestId, snapBuffer );
+        CLOG_WRITEF( _L( "GetSortSNAPDataL returned = %d. list.Count() = %d" ), err, snapBuffer.Count() );
+
+        if ( err == KErrNone )
+            {
+            RCmConnectionMethodExt cmConnMethodExt;
+            CleanupClosePushL( cmConnMethodExt );
+            for ( TInt numCM = 0; numCM < snapBuffer.Count(); numCM++ )
+                {
+                AddConnectionMethodItemL( snapBuffer.iIapId[numCM], 
+                                          iDestId == 0,
+                                          easyWlanIsInDb, 
+                                          snapBuffer.iIapId[numCM] == iDefaultCMId );
+                }
+            CleanupStack::PopAndDestroy();  // cmConnMethodExt
+            }   
+
+    // Add any ad-hoc WLAN iaps to the list
+    if ( ( iBearerSet & ECommDbBearerWLAN ) && ( iDestId == 0 ) && iIsWLANFeatureSupported )
+        {
+        AddAdhocWlanIapsL();	
+        }
+
+    CLOG_LEAVEFN( "CActiveSelectExplicit::BuildConnectionListL " );
+    }
+
+
+// ---------------------------------------------------------
+// CActiveSelectExplicit::AddConnectionMethodItemL()
+// ---------------------------------------------------------
+//
+void CActiveSelectExplicit::AddConnectionMethodItemL( TUint32 aId,
+                                                TBool aCheckForEasyWlan, 
+                                                TBool& aEasyWlanIsInDb, 
+                                                TBool aDefaultCM )
+    {
+    CLOG_ENTERFN( "CActiveSelectExplicit::AddConnectionMethodItemL" );  
+
+    CConnectionInfo* conIn;
+
+    RCmConnectionMethodExt cmConnMethodExt;
+    CLOG_WRITEF( _L( "Uncat dest id %d" ), aId );
+
+    TRAPD( err, cmConnMethodExt = iCmManagerExt.ConnectionMethodL( aId ) );
+    CLOG_WRITEF( _L( "err %d" ), err );
+
+    if ( err == KErrNone )
+        {
+        CleanupClosePushL( cmConnMethodExt );
+
+        TUint32 bearer = cmConnMethodExt.GetIntAttributeL( 
+                                                        ECmCommsDBBearerType );
+        CLOG_WRITEF( _L( "bearer %d" ), bearer );
+
+        if ( bearer & iBearerSet )
+            {
+            CLOG_WRITE( "To be listed!" );
+
+            TBool isCMEasyWlan = EFalse;
+
+            HBufC* bufName = cmConnMethodExt.GetStringAttributeL(
+                                                                ECmName );
+
+            TBuf<CommsDat::KMaxTextLength+1> nameCM;
+            nameCM = *bufName;
+            nameCM.ZeroTerminate();
+            delete bufName;
+
+            CLOG_WRITEF( _L( "Method name %s. Bearer = %d" ), nameCM.Ptr(), bearer );
+
+            if ( aCheckForEasyWlan && bearer == KCommDbBearerWLAN && 
+                 iIsWLANFeatureSupported )
+                {
+                if ( !aEasyWlanIsInDb )
+                    {
+                    HBufC* bufSSID = cmConnMethodExt.GetStringAttributeL( 
+                                                                EWlanSSID );
+                    if ( !bufSSID || bufSSID->Des().Length() == 0 )
+                        {
+                        isCMEasyWlan = ETrue;
+                        aEasyWlanIsInDb = ETrue;
+                        }
+                    delete bufSSID;
+                    }
+                }
+
+            if ( !isCMEasyWlan )
+                {
+                CGulIcon* iconCM = ( CGulIcon* )
+                                    cmConnMethodExt.GetIntAttributeL(
+                                                            ECmBearerIcon );
+                if ( iconCM )
+                    {
+                    CLOG_WRITEF( _L( "iconCM found" ) );
+                    CleanupStack::PushL( iconCM );
+                    iIcons->AppendL( iconCM );
+
+                    // icon array took over ownership
+                    CleanupStack::Pop( iconCM );
+                    }
+                else
+                    {
+                    CLOG_WRITEF( _L( "iconCM not found" ) );
+                    }
+
+                TBuf<KMaxEntryLength> temp;
+                _LIT( KIconIdName, "%d\t%s" );
+                _LIT( KIconIdNameDefaultConn, "%d\t%s\t0" );
+
+                if ( aDefaultCM )
+                    {
+                    temp.Format( KIconIdNameDefaultConn, iIcons->Count()-1,
+                                 nameCM.Ptr() );
+                    }
+                else
+                    {
+                    temp.Format( KIconIdName, iIcons->Count()-1, 
+                                 nameCM.Ptr() );
+                    }
+
+                conIn = CConnectionInfo::NewL( aId, 0, temp );
+                CleanupStack::PushL( conIn );
+                iItems->AppendL( conIn );
+                CleanupStack::Pop( conIn );
+                }
+            }
+        CleanupStack::PopAndDestroy();  // cmConnMethodExt
+        }
+
+    CLOG_LEAVEFN( "CActiveSelectExplicit::AddConnectionMethodItemL" );
+    }
+
+// ---------------------------------------------------------
+// CActiveSelectExplicit::AddAdhocWlanIapsL()
+// ---------------------------------------------------------
+//
+void CActiveSelectExplicit::AddAdhocWlanIapsL()
+    {
+    CLOG_ENTERFN( "CActiveSelectExplicit::AddAdhocWlanIapsL " );
+    
+    // Creating a session with the latest version
+    CMDBSession* db = CMDBSession::NewLC( CMDBSession::LatestVersion() );
+    db->SetAttributeMask( ECDProtectedWrite );
+    
+    // Create wlan service record set (RArray (or RPtrArray?))
+    CMDBRecordSet<CCDWlanServiceRecord>* wlanSet =
+        new (ELeave)CMDBRecordSet<CCDWlanServiceRecord>(   CCDWlanServiceRecord::TableIdL( *db )   );
+    CleanupStack::PushL( wlanSet ); 
+    
+    // Create wlan service record
+    CCDWlanServiceRecord* wlanRecord =
+        new (ELeave)CCDWlanServiceRecord(   CCDWlanServiceRecord::TableIdL( *db )   );
+    
+    CleanupStack::PushL( wlanRecord );
+    
+    // Set ConnectionMode field in wlan service record (see wlancontainer.h)
+    // This works with EWlanOperatingModeAdhoc, fails with EWlanConnectionModeAdhoc
+    wlanRecord->iWlanConnMode.SetL( EWlanOperatingModeAdhoc );
+    
+    // Append wlan service record to wlan service record set (currently empty)
+    wlanSet->iRecords.AppendL( wlanRecord );
+    CleanupStack::Pop( wlanRecord ); // ownership moved to RPointerArray
+    
+    // Find matcing wlan service records
+    if( wlanSet->FindL( *db ) )
+        {
+        TInt wlanRecordCount( wlanSet->iRecords.Count() );
+        CLOG_WRITEF( _L("wlanSet record count = %d"), wlanRecordCount );
+        
+        TBool easyWlanIsInDb = EFalse;
+        
+        // loop for each record found
+        for ( TInt i = 0; i < wlanRecordCount; i++ )
+            {
+            // Seems we need to specifically load the current record again to be sure all fields are up to date
+            wlanRecord->SetElementId( wlanSet->iRecords[i]->ElementId() );
+            // Load will only look at ElementId and updates the rest of the fields
+            wlanRecord->LoadL( *db );
+            
+            if ( !( wlanRecord->iWLanSSID.IsNull() ) )
+                {
+                // Don't include Easy WLAN
+                // lets print some stuff to log            
+                CLOG_WRITEF( _L("New ad-hoc WLAN IAP:" ));
+                CLOG_WRITEF( _L("  iWlanServiceId = %d"), static_cast<TUint>( wlanRecord->iWlanServiceId ) );
+                CLOG_WRITEF( _L("  iWlanConnMode  = %d"), static_cast<TUint>( wlanRecord->iWlanConnMode ) );
+                CLOG_WRITEF( _L("  iWLanSSID      = %S"), &(static_cast<TDesC>( wlanRecord->iWLanSSID ) ) );
+            
+                // Create an iap record
+                CCDIAPRecord* iapRecord = static_cast<CCDIAPRecord*> ( 
+                    CCDRecordBase::RecordFactoryL( KCDTIdIAPRecord ) );
+                CleanupStack::PushL( iapRecord );
+            
+                iapRecord->iServiceType.SetL( TPtrC( KCDTypeNameLANService ) );
+                // Set the service field to the same value as in the wlan service record we are currently looking
+                iapRecord->iService = wlanRecord->iWlanServiceId;
+                // Find the matching iap record
+                if( iapRecord->FindL( *db ) )
+                    {
+                    TUint iapId( 0 );
+                
+                    // read the iap id
+                    iapId = iapRecord->RecordId();
+                    CLOG_WRITEF( _L("  iapId          = %d"), iapId );
+                
+                    AddConnectionMethodItemL( iapId, 
+                                              iDestId == 0,
+                                              easyWlanIsInDb, 
+                                              iapId == iDefaultCMId );
+                    }
+                CleanupStack::PopAndDestroy( iapRecord );
+                }
+            }
+        }
+    else
+        {
+        CLOG_WRITEF( _L("no matcing wlan records found." ));
+        }
+        
+    CleanupStack::PopAndDestroy( wlanSet );
+    CleanupStack::PopAndDestroy( db );
+    
+    CLOG_LEAVEFN( "CActiveSelectExplicit::AddAdhocWlanIapsL" );
+    }
+    
+// End of File