satengine/satserver/Engine/src/CSatApnHandler.cpp
author hgs
Fri, 15 Oct 2010 13:21:28 +0300
changeset 53 25b8d29b7c59
parent 33 8d5d7fcf9b59
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
33
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2002-2010 Nokia Corporation and/or its subsidiary(-ies). 
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:  Handles APN operations
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
// INCLUDE FILES
hgs
parents:
diff changeset
    19
#include <cmmanager.h>
hgs
parents:
diff changeset
    20
#include <cmconnectionmethod.h>
hgs
parents:
diff changeset
    21
#include <cmconnectionmethoddef.h>
hgs
parents:
diff changeset
    22
#include <cmpluginpacketdatadef.h>
hgs
parents:
diff changeset
    23
#include <cmdestination.h>
hgs
parents:
diff changeset
    24
#include <cmmanagerdef.h>
hgs
parents:
diff changeset
    25
hgs
parents:
diff changeset
    26
#include    "MSatUtils.h"
hgs
parents:
diff changeset
    27
#include    "CSatApnHandler.h"
hgs
parents:
diff changeset
    28
#include    "SatLog.h"
hgs
parents:
diff changeset
    29
hgs
parents:
diff changeset
    30
const TUint32 KSatCMGranularity( 5 );
hgs
parents:
diff changeset
    31
hgs
parents:
diff changeset
    32
// ============================ MEMBER FUNCTIONS ===============================
hgs
parents:
diff changeset
    33
hgs
parents:
diff changeset
    34
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    35
// CSatApnHandler::CSatApnHandler
hgs
parents:
diff changeset
    36
// C++ default constructor can NOT contain any code, that
hgs
parents:
diff changeset
    37
// might leave.
hgs
parents:
diff changeset
    38
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    39
//
hgs
parents:
diff changeset
    40
CSatApnHandler::CSatApnHandler( MSatUtils& aUtils ) :
hgs
parents:
diff changeset
    41
    iUtils( aUtils )
hgs
parents:
diff changeset
    42
    {
hgs
parents:
diff changeset
    43
    LOG( SIMPLE,
hgs
parents:
diff changeset
    44
        "SATENGINE: CSatApnHandler::CSatApnHandler calling-exiting" )
hgs
parents:
diff changeset
    45
    }
hgs
parents:
diff changeset
    46
hgs
parents:
diff changeset
    47
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    48
// CSatApnHandler::NewL
hgs
parents:
diff changeset
    49
// Two-phased constructor.
hgs
parents:
diff changeset
    50
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    51
//
hgs
parents:
diff changeset
    52
CSatApnHandler* CSatApnHandler::NewL( MSatUtils& aUtils )
hgs
parents:
diff changeset
    53
    {
hgs
parents:
diff changeset
    54
    LOG( SIMPLE, "SATENGINE: CSatApnHandler::NewL calling" )
hgs
parents:
diff changeset
    55
hgs
parents:
diff changeset
    56
    CSatApnHandler* self = new( ELeave )CSatApnHandler( aUtils );
hgs
parents:
diff changeset
    57
    LOG( SIMPLE, "SATENGINE: CSatApnHandler::NewL exiting" )
hgs
parents:
diff changeset
    58
    return self;
hgs
parents:
diff changeset
    59
    }
hgs
parents:
diff changeset
    60
hgs
parents:
diff changeset
    61
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    62
// CSatApnHandler::Destructor
hgs
parents:
diff changeset
    63
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    64
//
hgs
parents:
diff changeset
    65
CSatApnHandler::~CSatApnHandler()
hgs
parents:
diff changeset
    66
    {
hgs
parents:
diff changeset
    67
    LOG( SIMPLE,
hgs
parents:
diff changeset
    68
        "SATENGINE: CSatApnHandler::~CSatApnHandler calling" )
hgs
parents:
diff changeset
    69
    LOG( SIMPLE,
hgs
parents:
diff changeset
    70
        "SATENGINE: CSatApnHandler::~CSatApnHandler exiting" )
hgs
parents:
diff changeset
    71
    }
hgs
parents:
diff changeset
    72
hgs
parents:
diff changeset
    73
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    74
// CSatApnHandler::GetApnInfoL
hgs
parents:
diff changeset
    75
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    76
//
hgs
parents:
diff changeset
    77
void CSatApnHandler::GetApnInfoL(
hgs
parents:
diff changeset
    78
    const RSat::TAccessName& aName,
hgs
parents:
diff changeset
    79
    const RSat::TTextString& aUserLogin,
hgs
parents:
diff changeset
    80
    const RSat::TTextString& aUserPwd,
hgs
parents:
diff changeset
    81
    TUint32& aIapId,
hgs
parents:
diff changeset
    82
    TUint32& aNwId,
hgs
parents:
diff changeset
    83
    TBool& aApnCreated,
hgs
parents:
diff changeset
    84
    const RPacketContext::TProtocolType& aPdpType,
hgs
parents:
diff changeset
    85
    const TDesC8& aLocalAddress )
hgs
parents:
diff changeset
    86
    {
hgs
parents:
diff changeset
    87
    LOG( SIMPLE, "SATENGINE: CSatApnHandler::GetApnInfoL calling" )
hgs
parents:
diff changeset
    88
hgs
parents:
diff changeset
    89
hgs
parents:
diff changeset
    90
    // First check the length of the APN
hgs
parents:
diff changeset
    91
    if ( !aName.Length() )
hgs
parents:
diff changeset
    92
        {
hgs
parents:
diff changeset
    93
        LOG( SIMPLE, "SATENGINE: CSatApnHandler::GetApnInfoL \
hgs
parents:
diff changeset
    94
        aName.Length() == 0" )
hgs
parents:
diff changeset
    95
        User::Leave( KErrNotFound );
hgs
parents:
diff changeset
    96
        }
hgs
parents:
diff changeset
    97
hgs
parents:
diff changeset
    98
    // Format APN
hgs
parents:
diff changeset
    99
    HBufC* formatName = FormatAPN( aName );
hgs
parents:
diff changeset
   100
hgs
parents:
diff changeset
   101
    if ( !formatName )
hgs
parents:
diff changeset
   102
        {
hgs
parents:
diff changeset
   103
        LOG( SIMPLE, "SATENGINE: CSatApnHandler::GetApnInfoL wrong APN name \
hgs
parents:
diff changeset
   104
            format" )
hgs
parents:
diff changeset
   105
        // APN was in false format, leave
hgs
parents:
diff changeset
   106
        User::Leave( KErrArgument );
hgs
parents:
diff changeset
   107
        }
hgs
parents:
diff changeset
   108
    CleanupStack::PushL( formatName );
hgs
parents:
diff changeset
   109
hgs
parents:
diff changeset
   110
    // Reference params
hgs
parents:
diff changeset
   111
    TUint32 iapId( 0 );
hgs
parents:
diff changeset
   112
    TUint32 networkId( 0 );
hgs
parents:
diff changeset
   113
hgs
parents:
diff changeset
   114
    // Find if the connection method already exists 
hgs
parents:
diff changeset
   115
    // Initialize the flags
hgs
parents:
diff changeset
   116
    TBool found = EFalse;
hgs
parents:
diff changeset
   117
    aApnCreated = EFalse;
hgs
parents:
diff changeset
   118
hgs
parents:
diff changeset
   119
    // Create CMManager Session
hgs
parents:
diff changeset
   120
    RCmManager cmManager;
hgs
parents:
diff changeset
   121
    cmManager.OpenLC();
hgs
parents:
diff changeset
   122
hgs
parents:
diff changeset
   123
    // Get the Connection Method list from the open CMManager session
hgs
parents:
diff changeset
   124
    RArray<TUint32> array = RArray<TUint32>( KSatCMGranularity );
hgs
parents:
diff changeset
   125
    CleanupClosePushL( array );
hgs
parents:
diff changeset
   126
hgs
parents:
diff changeset
   127
    cmManager.ConnectionMethodL( array );
hgs
parents:
diff changeset
   128
    
hgs
parents:
diff changeset
   129
    // Go through the Connection Method list to find if there is matched one
hgs
parents:
diff changeset
   130
    HBufC* apnCM;
hgs
parents:
diff changeset
   131
hgs
parents:
diff changeset
   132
    LOG2( SIMPLE, "SATENGINE: CSatApnHandler::GetApnInfoL, \
hgs
parents:
diff changeset
   133
                   required pdp type is %d", aPdpType )
hgs
parents:
diff changeset
   134
hgs
parents:
diff changeset
   135
    for( TInt i = 0; ( i < array.Count() ) && !found; ++i )
hgs
parents:
diff changeset
   136
        {
hgs
parents:
diff changeset
   137
        RCmConnectionMethod cm = cmManager.ConnectionMethodL( array[i] );
hgs
parents:
diff changeset
   138
        
hgs
parents:
diff changeset
   139
        CleanupClosePushL( cm );
hgs
parents:
diff changeset
   140
        // query the APN of the Connection Method
hgs
parents:
diff changeset
   141
        apnCM = cm.GetStringAttributeL( CMManager::EPacketDataAPName );
hgs
parents:
diff changeset
   142
        CleanupStack::PushL( apnCM );
hgs
parents:
diff changeset
   143
        // query the pdpType of the Connection Method
hgs
parents:
diff changeset
   144
        TInt pdpType = cm.GetIntAttributeL( CMManager::EPacketDataPDPType );
hgs
parents:
diff changeset
   145
hgs
parents:
diff changeset
   146
        
hgs
parents:
diff changeset
   147
        if ( ( pdpType == aPdpType ) && ( *apnCM == *formatName ) )
hgs
parents:
diff changeset
   148
            {
hgs
parents:
diff changeset
   149
            // Found the Connection Method, query the IapId and NwId
hgs
parents:
diff changeset
   150
            LOG( SIMPLE, "SATENGINE: CSatApnHandler::GetApnInfoL, \
hgs
parents:
diff changeset
   151
                          Record found" )
hgs
parents:
diff changeset
   152
hgs
parents:
diff changeset
   153
            // Get IAP Id, Network Id
hgs
parents:
diff changeset
   154
            networkId = cm.GetIntAttributeL( CMManager::ECmNetworkId );
hgs
parents:
diff changeset
   155
            LOG2( SIMPLE, "SATENGINE: CSatApnHandler::GetApnInfoL, \
hgs
parents:
diff changeset
   156
                           networkId %d", networkId ) 
hgs
parents:
diff changeset
   157
            
hgs
parents:
diff changeset
   158
            iapId = cm.GetIntAttributeL( CMManager::ECmIapId );
hgs
parents:
diff changeset
   159
            LOG2( SIMPLE, "SATENGINE: CSatApnHandler::GetApnInfoL, \
hgs
parents:
diff changeset
   160
                           iapId %d", iapId )
hgs
parents:
diff changeset
   161
    
hgs
parents:
diff changeset
   162
            found = ETrue;
hgs
parents:
diff changeset
   163
            }
hgs
parents:
diff changeset
   164
        CleanupStack::PopAndDestroy( apnCM );
hgs
parents:
diff changeset
   165
        CleanupStack::PopAndDestroy( &cm );    
hgs
parents:
diff changeset
   166
        }        
hgs
parents:
diff changeset
   167
 
hgs
parents:
diff changeset
   168
    CleanupStack::PopAndDestroy( &array );
hgs
parents:
diff changeset
   169
hgs
parents:
diff changeset
   170
    if ( !found )
hgs
parents:
diff changeset
   171
        {
hgs
parents:
diff changeset
   172
        // No Connection Method found, insert a new one
hgs
parents:
diff changeset
   173
    
hgs
parents:
diff changeset
   174
        LOG( SIMPLE, "SATENGINE: CSatApnHandler::GetApnInfoL, \
hgs
parents:
diff changeset
   175
                      Record Not found, insert a new one" )
hgs
parents:
diff changeset
   176
        
hgs
parents:
diff changeset
   177
        TRAPD( insertError, InsertRecordL( *formatName, aUserLogin, 
hgs
parents:
diff changeset
   178
               aUserPwd, iapId, networkId, aPdpType, aLocalAddress ) )
hgs
parents:
diff changeset
   179
hgs
parents:
diff changeset
   180
        if ( KErrNone == insertError )
hgs
parents:
diff changeset
   181
            {
hgs
parents:
diff changeset
   182
            // Insert OK
hgs
parents:
diff changeset
   183
            LOG( NORMAL, "SATENGINE: CSatApnHandler::GetApnInfoL, \
hgs
parents:
diff changeset
   184
                          new record inserted" )
hgs
parents:
diff changeset
   185
            aApnCreated = ETrue;
hgs
parents:
diff changeset
   186
            }
hgs
parents:
diff changeset
   187
        }
hgs
parents:
diff changeset
   188
    
hgs
parents:
diff changeset
   189
    CleanupStack::PopAndDestroy( &cmManager );
hgs
parents:
diff changeset
   190
    CleanupStack::PopAndDestroy( formatName );
hgs
parents:
diff changeset
   191
hgs
parents:
diff changeset
   192
    // Set return values
hgs
parents:
diff changeset
   193
    aIapId = iapId;
hgs
parents:
diff changeset
   194
    aNwId = networkId;
hgs
parents:
diff changeset
   195
hgs
parents:
diff changeset
   196
    LOG( SIMPLE, "SATENGINE: CSatApnHandler::GetApnInfoL exiting" )
hgs
parents:
diff changeset
   197
    }
hgs
parents:
diff changeset
   198
hgs
parents:
diff changeset
   199
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   200
// CSatApnHandler::DeleteApnL
hgs
parents:
diff changeset
   201
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   202
//
hgs
parents:
diff changeset
   203
void CSatApnHandler::DeleteApnL( TUint32 aApnId )
hgs
parents:
diff changeset
   204
    {
hgs
parents:
diff changeset
   205
    LOG( SIMPLE, "SATENGINE: CSatApnHandler::DeleteApnL calling" )
hgs
parents:
diff changeset
   206
hgs
parents:
diff changeset
   207
    if ( aApnId )
hgs
parents:
diff changeset
   208
        { 
hgs
parents:
diff changeset
   209
        // Create CMManager Session
53
hgs
parents: 33
diff changeset
   210
        RCmManager cmManager;
33
hgs
parents:
diff changeset
   211
        cmManager.OpenLC();
hgs
parents:
diff changeset
   212
        
hgs
parents:
diff changeset
   213
        // Get the connection method
53
hgs
parents: 33
diff changeset
   214
        RCmConnectionMethod cm;
33
hgs
parents:
diff changeset
   215
        cm = cmManager.ConnectionMethodL( aApnId );
hgs
parents:
diff changeset
   216
        CleanupClosePushL( cm );
hgs
parents:
diff changeset
   217
hgs
parents:
diff changeset
   218
        cm.DeleteL();
hgs
parents:
diff changeset
   219
        LOG2( SIMPLE, "SATENGINE: CSatApnHandler::DeleteApnL, \
hgs
parents:
diff changeset
   220
                       delete the connection method %d", aApnId )
hgs
parents:
diff changeset
   221
hgs
parents:
diff changeset
   222
        CleanupStack::PopAndDestroy( &cm );
hgs
parents:
diff changeset
   223
        CleanupStack::PopAndDestroy( &cmManager );
hgs
parents:
diff changeset
   224
        }
hgs
parents:
diff changeset
   225
hgs
parents:
diff changeset
   226
    LOG( SIMPLE, "SATENGINE: CSatApnHandler::DeleteApnL exiting" )
hgs
parents:
diff changeset
   227
    }
hgs
parents:
diff changeset
   228
hgs
parents:
diff changeset
   229
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   230
// CSatApnHandler::InsertRecordL
hgs
parents:
diff changeset
   231
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   232
//
hgs
parents:
diff changeset
   233
void CSatApnHandler::InsertRecordL(
hgs
parents:
diff changeset
   234
    const TDesC& aReqApn,
hgs
parents:
diff changeset
   235
    const RSat::TTextString& aUserLogin,
hgs
parents:
diff changeset
   236
    const RSat::TTextString& aUserPwd,
hgs
parents:
diff changeset
   237
    TUint32& aIapId,
hgs
parents:
diff changeset
   238
    TUint32& aNwId,
hgs
parents:
diff changeset
   239
    const RPacketContext::TProtocolType aPdpType,
hgs
parents:
diff changeset
   240
    const TDesC8& aLocalAddress )
hgs
parents:
diff changeset
   241
    {
hgs
parents:
diff changeset
   242
    LOG( SIMPLE, "SATENGINE: CSatApnHandler::InsertRecordL calling" )
hgs
parents:
diff changeset
   243
hgs
parents:
diff changeset
   244
    LOG2( NORMAL, "SATENGINE: CSatApnHandler::InsertRecordL, apn is %S", 
hgs
parents:
diff changeset
   245
        &aReqApn )
hgs
parents:
diff changeset
   246
    
hgs
parents:
diff changeset
   247
    // Create CMManager Session
53
hgs
parents: 33
diff changeset
   248
    RCmManager cmManager;
33
hgs
parents:
diff changeset
   249
    cmManager.OpenLC();
hgs
parents:
diff changeset
   250
hgs
parents:
diff changeset
   251
    // Create a connection method without destination. So when we can find 
hgs
parents:
diff changeset
   252
    // the connection method by going through the connection method list.
53
hgs
parents: 33
diff changeset
   253
    RCmConnectionMethod cm;
33
hgs
parents:
diff changeset
   254
    cm = cmManager.CreateConnectionMethodL( KUidPacketDataBearerType );
hgs
parents:
diff changeset
   255
    CleanupClosePushL( cm );
hgs
parents:
diff changeset
   256
    
hgs
parents:
diff changeset
   257
    // This is shown in GS in Access Point list
hgs
parents:
diff changeset
   258
    cm.SetStringAttributeL( CMManager::ECmName, iUtils.BipApnName() );    
hgs
parents:
diff changeset
   259
    // GPRS connection name
hgs
parents:
diff changeset
   260
    cm.SetStringAttributeL( CMManager::EPacketDataAPName, aReqApn );   
hgs
parents:
diff changeset
   261
    // IPv4 or IPv6
hgs
parents:
diff changeset
   262
    cm.SetIntAttributeL( CMManager::EPacketDataPDPType, aPdpType );
hgs
parents:
diff changeset
   263
hgs
parents:
diff changeset
   264
    // Set the local IP address (if any)
hgs
parents:
diff changeset
   265
    if ( aLocalAddress.Length() )
hgs
parents:
diff changeset
   266
        {
hgs
parents:
diff changeset
   267
        LOG2( SIMPLE, "SATENGINE: CSatApnHandler::InsertRecordL, Local addr \
hgs
parents:
diff changeset
   268
            length: %i", aLocalAddress.Length() )
hgs
parents:
diff changeset
   269
        cm.SetString8AttributeL( CMManager::EPacketDataPDPAddress, 
hgs
parents:
diff changeset
   270
            aLocalAddress );
hgs
parents:
diff changeset
   271
        }
hgs
parents:
diff changeset
   272
hgs
parents:
diff changeset
   273
    cm.SetBoolAttributeL( CMManager::ECmWapIPSecurity, EFalse );
hgs
parents:
diff changeset
   274
    cm.SetIntAttributeL( CMManager::ECmWapIPWSPOption, 
hgs
parents:
diff changeset
   275
                         CMManager::ECmWapWspOptionConnectionOriented );
hgs
parents:
diff changeset
   276
    cm.SetBoolAttributeL( CMManager::EPacketDataDisablePlainTextAuth, EFalse );
hgs
parents:
diff changeset
   277
    cm.SetBoolAttributeL( CMManager::ECmIFPromptForAuth, EFalse );
hgs
parents:
diff changeset
   278
hgs
parents:
diff changeset
   279
    if ( aUserLogin != KNullDesC )
hgs
parents:
diff changeset
   280
        {
hgs
parents:
diff changeset
   281
        LOG2( NORMAL, "SATENGINE: CSatApnHandler::InsertRecordL, \
hgs
parents:
diff changeset
   282
            username is %S", &aUserLogin ) 
hgs
parents:
diff changeset
   283
        cm.SetStringAttributeL( CMManager::ECmIFAuthName, aUserLogin );
hgs
parents:
diff changeset
   284
hgs
parents:
diff changeset
   285
        if ( aUserPwd != KNullDesC )
hgs
parents:
diff changeset
   286
            {
hgs
parents:
diff changeset
   287
            LOG2( NORMAL, "SATENGINE: CSatApnHandler::InsertRecordL, \
hgs
parents:
diff changeset
   288
                pwd is %S", &aUserPwd ) 
hgs
parents:
diff changeset
   289
            cm.SetStringAttributeL( CMManager::ECmIFAuthPass, aUserPwd );
hgs
parents:
diff changeset
   290
            }
hgs
parents:
diff changeset
   291
        }
hgs
parents:
diff changeset
   292
    
hgs
parents:
diff changeset
   293
    // Update the access point ID for use later.
hgs
parents:
diff changeset
   294
    cm.UpdateL();
hgs
parents:
diff changeset
   295
hgs
parents:
diff changeset
   296
    // Get IAP Id, Network Id
hgs
parents:
diff changeset
   297
    aNwId = cm.GetIntAttributeL( CMManager::ECmNetworkId );
hgs
parents:
diff changeset
   298
    LOG2( SIMPLE, "SATENGINE: CSatApnHandler::InsertRecordL, \
hgs
parents:
diff changeset
   299
                   Nwid is %d", aNwId ) 
hgs
parents:
diff changeset
   300
    
hgs
parents:
diff changeset
   301
    aIapId = cm.GetIntAttributeL( CMManager::ECmIapId );
hgs
parents:
diff changeset
   302
    LOG2( SIMPLE, "SATENGINE: CSatApnHandler::InsertRecordL, \
hgs
parents:
diff changeset
   303
                   aIpId is %d", aIapId )
hgs
parents:
diff changeset
   304
hgs
parents:
diff changeset
   305
    CleanupStack::PopAndDestroy( &cm );
hgs
parents:
diff changeset
   306
    CleanupStack::PopAndDestroy( &cmManager );
hgs
parents:
diff changeset
   307
hgs
parents:
diff changeset
   308
    LOG( SIMPLE, "SATENGINE: CSatApnHandler::InsertRecordL exiting" )
hgs
parents:
diff changeset
   309
    }
hgs
parents:
diff changeset
   310
hgs
parents:
diff changeset
   311
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   312
// CSatApnHandler::FormatAPN
hgs
parents:
diff changeset
   313
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   314
//
hgs
parents:
diff changeset
   315
HBufC* CSatApnHandler::FormatAPN( const RSat::TAccessName& 
hgs
parents:
diff changeset
   316
    aReqApn ) const
hgs
parents:
diff changeset
   317
    {
hgs
parents:
diff changeset
   318
    LOG( SIMPLE, "SATENGINE: CSatApnHandler::FormatAPN calling" )
hgs
parents:
diff changeset
   319
hgs
parents:
diff changeset
   320
    // Length of the access point name
hgs
parents:
diff changeset
   321
    const TInt accessNameLength( aReqApn.Length() );
hgs
parents:
diff changeset
   322
    TInt index( 0 );
hgs
parents:
diff changeset
   323
hgs
parents:
diff changeset
   324
    // Format APN coming from SIM. Remove length infos and add dots
hgs
parents:
diff changeset
   325
    // from the requested APN. The APN format is, for example,
hgs
parents:
diff changeset
   326
    // '4Some9accesspnt2fi' and after the format the formatted APN
hgs
parents:
diff changeset
   327
    // should be 'Some.accesspnt.fi'
hgs
parents:
diff changeset
   328
    HBufC* formatApnName = HBufC::New( aReqApn.MaxLength() );
hgs
parents:
diff changeset
   329
hgs
parents:
diff changeset
   330
    if ( formatApnName )
hgs
parents:
diff changeset
   331
        {
hgs
parents:
diff changeset
   332
        TPtr formApn( formatApnName->Des() );
hgs
parents:
diff changeset
   333
hgs
parents:
diff changeset
   334
        // Indicates is the APN format correct. Can be detected only in loops.
hgs
parents:
diff changeset
   335
        TBool correctFormat( ETrue );
hgs
parents:
diff changeset
   336
hgs
parents:
diff changeset
   337
        // Loop requested APN. The first byte is always the length
hgs
parents:
diff changeset
   338
        for ( index = 0; index < accessNameLength && correctFormat; index++ )
hgs
parents:
diff changeset
   339
            {
hgs
parents:
diff changeset
   340
            // Next byte is the length of the next label
hgs
parents:
diff changeset
   341
            const TInt length( aReqApn[index] );
hgs
parents:
diff changeset
   342
hgs
parents:
diff changeset
   343
            // Label length cannot be bigger than the length of the APN
hgs
parents:
diff changeset
   344
            if ( ( index + length ) > accessNameLength )
hgs
parents:
diff changeset
   345
                {
hgs
parents:
diff changeset
   346
                LOG( SIMPLE, "SATENGINE: CSatApnHandler::FormatAPN \
hgs
parents:
diff changeset
   347
                ( index + length ) > accessNameLength" )
hgs
parents:
diff changeset
   348
                correctFormat = EFalse;
hgs
parents:
diff changeset
   349
                }
hgs
parents:
diff changeset
   350
hgs
parents:
diff changeset
   351
            // Append the label
hgs
parents:
diff changeset
   352
            for ( TInt j = 0; j < length && correctFormat; j++ )
hgs
parents:
diff changeset
   353
                {
hgs
parents:
diff changeset
   354
                index++; // move to next index
hgs
parents:
diff changeset
   355
                TChar next = aReqApn[index];
hgs
parents:
diff changeset
   356
                formApn.Append( next );
hgs
parents:
diff changeset
   357
                }
hgs
parents:
diff changeset
   358
hgs
parents:
diff changeset
   359
            // Add dot to APN if not end of APN
hgs
parents:
diff changeset
   360
            if ( accessNameLength > index + 1 )
hgs
parents:
diff changeset
   361
                {
hgs
parents:
diff changeset
   362
                LOG( SIMPLE, "SATENGINE: CSatApnHandler::FormatAPN \
hgs
parents:
diff changeset
   363
                accessNameLength > index + 1" )
hgs
parents:
diff changeset
   364
                formApn.Append( '.' );
hgs
parents:
diff changeset
   365
                }
hgs
parents:
diff changeset
   366
            }
hgs
parents:
diff changeset
   367
        LOG2( SIMPLE, "SATENGINE: CSatApnHandler::FormatAPN index: %i", index )
hgs
parents:
diff changeset
   368
hgs
parents:
diff changeset
   369
        // Check did we read all characters
hgs
parents:
diff changeset
   370
        if ( !correctFormat || ( index != accessNameLength ) )
hgs
parents:
diff changeset
   371
            {
hgs
parents:
diff changeset
   372
            // Format was not correct, return zero
hgs
parents:
diff changeset
   373
            formApn.Zero();
hgs
parents:
diff changeset
   374
            formApn.SetLength( 0 );
hgs
parents:
diff changeset
   375
            }
hgs
parents:
diff changeset
   376
        else
hgs
parents:
diff changeset
   377
            {
hgs
parents:
diff changeset
   378
            LOG( SIMPLE, "SATENGINE: CSatApnHandler::FormatAPN lower case" )
hgs
parents:
diff changeset
   379
            // Put characters to lower case
hgs
parents:
diff changeset
   380
            formApn.LowerCase();
hgs
parents:
diff changeset
   381
            }
hgs
parents:
diff changeset
   382
hgs
parents:
diff changeset
   383
        LOG( SIMPLE, "SATENGINE: CSatApnHandler::FormatAPN exiting" )
hgs
parents:
diff changeset
   384
        }
hgs
parents:
diff changeset
   385
hgs
parents:
diff changeset
   386
    return formatApnName;
hgs
parents:
diff changeset
   387
    }
hgs
parents:
diff changeset
   388
hgs
parents:
diff changeset
   389
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   390
// CSatApnHandler::FindDefaultApL
hgs
parents:
diff changeset
   391
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   392
//
hgs
parents:
diff changeset
   393
TUint32 CSatApnHandler::FindDefaultApL(
hgs
parents:
diff changeset
   394
        const RPacketContext::TProtocolType& aPdpType )
hgs
parents:
diff changeset
   395
    {
hgs
parents:
diff changeset
   396
    LOG( SIMPLE, "SATENGINE: CSatApnHandler::FindDefaultApL calling" );
hgs
parents:
diff changeset
   397
    TUint32 defaultIap( 0 );
hgs
parents:
diff changeset
   398
    TInt pdpType;
hgs
parents:
diff changeset
   399
    TBool isFound( EFalse );
hgs
parents:
diff changeset
   400
hgs
parents:
diff changeset
   401
    // create a network destination
hgs
parents:
diff changeset
   402
    RCmDestination des;
hgs
parents:
diff changeset
   403
    RCmConnectionMethod cm;
hgs
parents:
diff changeset
   404
hgs
parents:
diff changeset
   405
    // Create CMManager Session
hgs
parents:
diff changeset
   406
    RCmManager cmManager;
hgs
parents:
diff changeset
   407
    cmManager.OpenL();
hgs
parents:
diff changeset
   408
    CleanupClosePushL( cmManager );
hgs
parents:
diff changeset
   409
hgs
parents:
diff changeset
   410
    // Get the Connection Method list from the open CMManager session
hgs
parents:
diff changeset
   411
    RArray<TUint32> array( KSatCMGranularity );
hgs
parents:
diff changeset
   412
    CleanupClosePushL( array );
hgs
parents:
diff changeset
   413
hgs
parents:
diff changeset
   414
    // list all available destinations' id
hgs
parents:
diff changeset
   415
    cmManager.AllDestinationsL( array );
hgs
parents:
diff changeset
   416
    for( TInt i = 0; ( i < array.Count() ) && !isFound; ++i )
hgs
parents:
diff changeset
   417
        {
hgs
parents:
diff changeset
   418
        des = cmManager.DestinationL( array[i] );
hgs
parents:
diff changeset
   419
        CleanupClosePushL( des );
hgs
parents:
diff changeset
   420
hgs
parents:
diff changeset
   421
        if ( CMManager::ESnapPurposeInternet ==
hgs
parents:
diff changeset
   422
        des.MetadataL( CMManager::ESnapMetadataPurpose ) )
hgs
parents:
diff changeset
   423
            {
hgs
parents:
diff changeset
   424
            LOG( SIMPLE, "SATENGINE: CSatApnHandler::FindDefaultApL \
hgs
parents:
diff changeset
   425
            the fixed destination is identified as 'Internet'" );
hgs
parents:
diff changeset
   426
            for( TInt j = 0; ( j < des.ConnectionMethodCount() ) &&
hgs
parents:
diff changeset
   427
            !isFound; ++j )
hgs
parents:
diff changeset
   428
                {
hgs
parents:
diff changeset
   429
                cm = des.ConnectionMethodL( j );
hgs
parents:
diff changeset
   430
                CleanupClosePushL( cm );
hgs
parents:
diff changeset
   431
                pdpType = cm.GetIntAttributeL(
hgs
parents:
diff changeset
   432
                        CMManager::EPacketDataPDPType );
hgs
parents:
diff changeset
   433
                LOG2( SIMPLE, "SATENGINE: CSatApnHandler::FindDefaultApL \
hgs
parents:
diff changeset
   434
                        current protocol type is %d", pdpType )
hgs
parents:
diff changeset
   435
                if ( pdpType == aPdpType )
hgs
parents:
diff changeset
   436
                    {
hgs
parents:
diff changeset
   437
                    defaultIap = cm.GetIntAttributeL( CMManager::ECmIapId );
hgs
parents:
diff changeset
   438
                    isFound  = ETrue;
hgs
parents:
diff changeset
   439
                    LOG2( SIMPLE, "SATENGINE: CSatApnHandler::FindDefaultApL \
hgs
parents:
diff changeset
   440
                            default iap had been found %d", defaultIap )
hgs
parents:
diff changeset
   441
                    }
hgs
parents:
diff changeset
   442
                CleanupStack::PopAndDestroy( &cm );
hgs
parents:
diff changeset
   443
                }
hgs
parents:
diff changeset
   444
            }
hgs
parents:
diff changeset
   445
        CleanupStack::PopAndDestroy( &des );
hgs
parents:
diff changeset
   446
        }
hgs
parents:
diff changeset
   447
    CleanupStack::PopAndDestroy( &array );
hgs
parents:
diff changeset
   448
    CleanupStack::PopAndDestroy( &cmManager );
hgs
parents:
diff changeset
   449
hgs
parents:
diff changeset
   450
    if ( !isFound )
hgs
parents:
diff changeset
   451
        {
hgs
parents:
diff changeset
   452
        LOG( SIMPLE, "SATENGINE: CSatApnHandler: default AP not found" );
hgs
parents:
diff changeset
   453
        User::Leave( KErrNotFound );
hgs
parents:
diff changeset
   454
        }
hgs
parents:
diff changeset
   455
hgs
parents:
diff changeset
   456
    LOG( SIMPLE, "SATENGINE: CSatApnHandler::FindDefaultApL exit" )
hgs
parents:
diff changeset
   457
    return defaultIap;
hgs
parents:
diff changeset
   458
    }
hgs
parents:
diff changeset
   459
//  End of File