apengine/apeng/src/APSelect.cpp
branchRCL_3
changeset 13 68f0c7cd80ec
parent 8 2e6c4614c58e
child 17 c14618f9de99
--- a/apengine/apeng/src/APSelect.cpp	Fri Mar 12 15:44:18 2010 +0200
+++ b/apengine/apeng/src/APSelect.cpp	Mon Mar 15 12:42:11 2010 +0200
@@ -70,7 +70,7 @@
 
 
 // LOCAL CONSTANTS AND MACROS
-
+#define VPN_SERVICE_SNAP    _S("HomeSNAP")
 
 // LOCAL FUNCTION PROTOTYPES
 
@@ -856,9 +856,39 @@
                     CApUtils* util = CApUtils::NewLC( *iDb );
                     for ( i = 0; i < count; i++ )
                         {
-                        // get home wap id first
-                        pos = PosInArray( ipiapid, 
-                                          vpnArray->At( i ).iHomeIapId );
+                        if ( vpnArray->At( i ).iHomeIapId != 0 )
+                            {
+                            // get home wap id first
+                            pos = PosInArray( ipiapid, 
+                                             vpnArray->At( i ).iHomeIapId );
+                            
+                            }
+                        else if ( vpnArray->At( i ).iHomeSnapId != 0 )
+                            {
+                            // VPN IAP points to a SNAP. Just mark it available.
+                            pos = PosInArray( iapArrays[KVPN][1], vpnArray->At( i ).iVpnIapId );
+                            if ( pos != KErrNotFound )
+                                { // now get VPN IAP ID
+                                TUint32 tempvpniapid = iapArrays[KVPN][0]->At( pos );
+                                TUint32 tempvpnwapid ( 0 );
+                                TRAP( err, tempvpnwapid = 
+                                        util->WapIdFromIapIdL( 
+                                                tempvpniapid ) );
+                                                    
+                                item = CApListItem::NewLC
+                                    (
+                                    EIspTypeInternetAndWAP,
+                                    tempvpnwapid,
+                                    *vpnArray->At( i ).iName,                                   
+                                    EApBearerTypeAllBearers
+                                    );
+                                item->SetVpnFlag( ETrue );
+                                iApList->AppendL( item );
+                                CleanupStack::Pop( item );
+                                continue;
+                                }                                                          
+                            }                                                                                                              
+                        
                         TInt foundpos( KErrNotFound );
                         if ( pos!= KErrNotFound )
                             { // now we have the index in the
@@ -2216,7 +2246,8 @@
         if ( err != KErrNotFound )
             {
             TUint32 tempvpn( 0 );
-            TUint32 temphome( 0 );
+            TUint32 temphomeiap( 0 );
+            TUint32 temphomesnap( 0 );
             HBufC*  tempname = NULL;
             TVpnData data;
             TBool goon( ETrue );
@@ -2226,10 +2257,20 @@
                                             tempvpn );
                 if ( ( err == KErrNone ) && ( tempvpn ) )
                     {
+                    // First try to check if VPN IAP uses another IAP directly
                     err = ApCommons::ReadUintL( aTable, 
-                                                TPtrC(VPN_SERVICE_IAP),
-                                                temphome );
-                    if ( ( err == KErrNone ) && ( temphome ) )
+                                                TPtrC(VPN_SERVICE_IAP),                                                
+                                                temphomeiap );
+                    
+                    if ( (err != KErrNone ) || ( !tempvpn ) )
+                        {
+                        // IAP field was empty. VPN IAP must point to SNAP.
+                        err = ApCommons::ReadUintL( aTable, 
+                                TPtrC(VPN_SERVICE_SNAP),                                                
+                                temphomesnap );                                                         
+                        }
+                    
+                    if ( ( err == KErrNone ) && ( temphomeiap || temphomesnap ) )
                         {
                         // now get the name
 
@@ -2238,7 +2279,16 @@
                                                           TPtrC(COMMDB_NAME) );
                         
                         // everything is O.K., we can add the item
-                        data.iHomeIapId = temphome;
+                        if ( temphomesnap )
+                            {
+                            data.iHomeSnapId = temphomesnap;
+                            data.iHomeIapId = 0;
+                            }
+                        else
+                            {
+                            data.iHomeSnapId = 0;
+                            data.iHomeIapId = temphomeiap;                            
+                            }                       
                         data.iVpnIapId = tempvpn;
                         data.iName = tempname;
                         aVpnArray->AppendL( data ); // array owns it...