localconnectivityservice/modematplugin/src/atcopscmd.cpp
author hgs
Sat, 24 Apr 2010 00:11:33 +0300
changeset 29 ce4f184690c9
parent 26 d74a43a4aa59
permissions -rw-r--r--
201009
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
25
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2009 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 the commands "AT+COPS?", "AT+COPS=?" and "AT+COPS=..."
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
26
hgs
parents: 25
diff changeset
    19
#include <mmtsy_names.h>
25
hgs
parents:
diff changeset
    20
#include "atcopscmd.h"
hgs
parents:
diff changeset
    21
#include "cmdpluginobserver.h"
hgs
parents:
diff changeset
    22
#include "debug.h"
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
_LIT8( KCOPSTestCmd, "AT+COPS=?");
hgs
parents:
diff changeset
    25
_LIT8( KCOPSReadCmd, "AT+COPS?");
hgs
parents:
diff changeset
    26
_LIT8( KCOPSSetCmd,  "AT+COPS=");
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
_LIT8(KSupportedModesStr, ",(0,1,3,4)");
hgs
parents:
diff changeset
    29
_LIT8(KSupportedFormatsStr, ",(0,1,2)"); 
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
// The parameters are in predefined indexes in an incoming AT command. 
hgs
parents:
diff changeset
    32
const TInt KModeParameterIndex     			= 0;  
hgs
parents:
diff changeset
    33
const TInt KFormatParameterIndex   			= 1;  
hgs
parents:
diff changeset
    34
const TInt KOperatorParameterIndex 			= 2;  
hgs
parents:
diff changeset
    35
const TInt KAccessTechnologyParameterIndex  = 3;  
hgs
parents:
diff changeset
    36
hgs
parents:
diff changeset
    37
const TInt KMinimumParameterCountWhenModePresent       = 1;  
hgs
parents:
diff changeset
    38
const TInt KMinimumParameterCountWhenFormatPresent     = 2;  
hgs
parents:
diff changeset
    39
const TInt KMinimumParameterCountWhenOperatorPresent   = 3;  
hgs
parents:
diff changeset
    40
const TInt KMinimumParameterCountWhenAccTechPresent    = 4;  
hgs
parents:
diff changeset
    41
hgs
parents:
diff changeset
    42
// These parameter lengths are derived from 3GPP TS 27.007 V8.4.1
hgs
parents:
diff changeset
    43
const TInt KShortOperatorNameFormatLength 			= 10; 
hgs
parents:
diff changeset
    44
const TInt KLongOperatorNameFormatLength 			= 20; 
hgs
parents:
diff changeset
    45
const TInt KNumericOperatorNameFormatLength 		= 5; 
hgs
parents:
diff changeset
    46
const TInt KMaxNetworkTestResponseAdditionalSize 	= 17; // The maximun length of parts of fixed length. 
hgs
parents:
diff changeset
    47
const TInt KMaxNetworkReadResponseAdditionalSize 	= 28 ; // The maximun length of parts fixed length.
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    50
// Two-phased constructor.
hgs
parents:
diff changeset
    51
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    52
//
hgs
parents:
diff changeset
    53
CATCOPSCmd* CATCOPSCmd::NewL( MCmdPluginObserver* aCallback )
hgs
parents:
diff changeset
    54
    {
hgs
parents:
diff changeset
    55
    CATCOPSCmd* self = new (ELeave) CATCOPSCmd( aCallback );
hgs
parents:
diff changeset
    56
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
    57
    self->ConstructL();
hgs
parents:
diff changeset
    58
    CleanupStack::Pop( self );
hgs
parents:
diff changeset
    59
    return self;
hgs
parents:
diff changeset
    60
    }
hgs
parents:
diff changeset
    61
hgs
parents:
diff changeset
    62
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    63
// Destructor.
hgs
parents:
diff changeset
    64
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    65
//
hgs
parents:
diff changeset
    66
CATCOPSCmd::~CATCOPSCmd()
hgs
parents:
diff changeset
    67
    {
hgs
parents:
diff changeset
    68
    iParamArray.ResetAndDestroy(); 
hgs
parents:
diff changeset
    69
    iParamArray.Close(); 
hgs
parents:
diff changeset
    70
    iPacketService.Close(); 
hgs
parents:
diff changeset
    71
    iCustomApi.Close(); 
hgs
parents:
diff changeset
    72
    iPhone.Close(); 
hgs
parents:
diff changeset
    73
    iServer.Close();
hgs
parents:
diff changeset
    74
    delete iDetectedNetworks;
hgs
parents:
diff changeset
    75
    delete iRetrieveDetectedNetworks; 
hgs
parents:
diff changeset
    76
    }
hgs
parents:
diff changeset
    77
hgs
parents:
diff changeset
    78
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    79
// CATCOPSCmd::CATCOPSCmd
hgs
parents:
diff changeset
    80
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    81
//
hgs
parents:
diff changeset
    82
CATCOPSCmd::CATCOPSCmd( MCmdPluginObserver* aCallback ) :
hgs
parents:
diff changeset
    83
    CActive(EPriorityStandard),
hgs
parents:
diff changeset
    84
    iCallback( aCallback ), 
hgs
parents:
diff changeset
    85
	iFormat(RMmCustomAPI::EOperatorNameMccMnc), 
hgs
parents:
diff changeset
    86
    iRegistrationMode(EModeAutomatic), 
hgs
parents:
diff changeset
    87
    iAccTech(EAccTechNotSet), 
hgs
parents:
diff changeset
    88
    iCurrentOperation(EIdle)
hgs
parents:
diff changeset
    89
    {
hgs
parents:
diff changeset
    90
    iCmdHandlerType = ECmdHandlerTypeUndefined;
hgs
parents:
diff changeset
    91
    }
hgs
parents:
diff changeset
    92
hgs
parents:
diff changeset
    93
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    94
// CATCOPSCmd::ConstructL
hgs
parents:
diff changeset
    95
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    96
//
hgs
parents:
diff changeset
    97
void CATCOPSCmd::ConstructL()
hgs
parents:
diff changeset
    98
    {
hgs
parents:
diff changeset
    99
    if ( !iCallback )
hgs
parents:
diff changeset
   100
        {
hgs
parents:
diff changeset
   101
        User::Leave( KErrGeneral );
hgs
parents:
diff changeset
   102
        }
hgs
parents:
diff changeset
   103
    CActiveScheduler::Add(this);
hgs
parents:
diff changeset
   104
    LEAVE_IF_ERROR(iServer.Connect());
hgs
parents:
diff changeset
   105
    LEAVE_IF_ERROR(iServer.LoadPhoneModule(KMmTsyModuleName));
hgs
parents:
diff changeset
   106
    LEAVE_IF_ERROR(iPhone.Open(iServer, KMmTsyPhoneName));
hgs
parents:
diff changeset
   107
    LEAVE_IF_ERROR(iCustomApi.Open(iPhone));
hgs
parents:
diff changeset
   108
    LEAVE_IF_ERROR(iPacketService.Open(iPhone));
hgs
parents:
diff changeset
   109
    iRetrieveDetectedNetworks = CRetrieveMobilePhoneDetectedNetworks::NewL(iPhone); 
hgs
parents:
diff changeset
   110
    }
hgs
parents:
diff changeset
   111
hgs
parents:
diff changeset
   112
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   113
// Reports the support status of an AT command. This is a synchronous API.
hgs
parents:
diff changeset
   114
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   115
//
hgs
parents:
diff changeset
   116
TBool CATCOPSCmd::IsCommandSupported( const TDesC8& aCmd )
hgs
parents:
diff changeset
   117
    {
hgs
parents:
diff changeset
   118
    TRACE_FUNC_ENTRY
hgs
parents:
diff changeset
   119
    TInt retTemp = KErrNone;
hgs
parents:
diff changeset
   120
hgs
parents:
diff changeset
   121
		// First test if "test" command, because the pattern is similar with the "set" command, 
hgs
parents:
diff changeset
   122
		// this is just one extra question mark longer than that. 
hgs
parents:
diff changeset
   123
    retTemp = aCmd.Compare( KCOPSTestCmd );
hgs
parents:
diff changeset
   124
    if ( retTemp == 0 )
hgs
parents:
diff changeset
   125
        {
hgs
parents:
diff changeset
   126
        iCmdHandlerType = ECmdHandlerTypeTest;
hgs
parents:
diff changeset
   127
        TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   128
        return ETrue;
hgs
parents:
diff changeset
   129
        }
hgs
parents:
diff changeset
   130
hgs
parents:
diff changeset
   131
    retTemp = aCmd.Compare( KCOPSReadCmd );
hgs
parents:
diff changeset
   132
    if ( retTemp == 0 )
hgs
parents:
diff changeset
   133
        {
hgs
parents:
diff changeset
   134
        iCmdHandlerType = ECmdHandlerTypeRead;
hgs
parents:
diff changeset
   135
        TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   136
        return ETrue;
hgs
parents:
diff changeset
   137
        }
hgs
parents:
diff changeset
   138
hgs
parents:
diff changeset
   139
	// Test if the beginning matches the test command pattern. We're skipping parameters 
hgs
parents:
diff changeset
   140
	// here on purpose, because "set" handler will create an error reply later if 
hgs
parents:
diff changeset
   141
	// parameters are not valid. 
hgs
parents:
diff changeset
   142
    retTemp = aCmd.Left(KCOPSSetCmd().Length()).Compare(KCOPSSetCmd);
hgs
parents:
diff changeset
   143
    if ( retTemp == 0 )
hgs
parents:
diff changeset
   144
        {
hgs
parents:
diff changeset
   145
        iCmdHandlerType = ECmdHandlerTypeSet;
hgs
parents:
diff changeset
   146
        TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   147
        return ETrue;
hgs
parents:
diff changeset
   148
        }
hgs
parents:
diff changeset
   149
hgs
parents:
diff changeset
   150
    iCmdHandlerType = ECmdHandlerTypeUndefined;
hgs
parents:
diff changeset
   151
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   152
    return EFalse;
hgs
parents:
diff changeset
   153
    }
hgs
parents:
diff changeset
   154
hgs
parents:
diff changeset
   155
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   156
// Handles an AT command. Cancelling of the pending request is done by
hgs
parents:
diff changeset
   157
// HandleCommandCancel(). The implementation in the extension plugin should
hgs
parents:
diff changeset
   158
// be asynchronous.
hgs
parents:
diff changeset
   159
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   160
//
hgs
parents:
diff changeset
   161
void CATCOPSCmd::HandleCommand( const TDesC8& aCmd,
hgs
parents:
diff changeset
   162
                                   RBuf8& aReply,
hgs
parents:
diff changeset
   163
                                   TBool aReplyNeeded )
hgs
parents:
diff changeset
   164
    {
hgs
parents:
diff changeset
   165
    TRACE_FUNC_ENTRY
hgs
parents:
diff changeset
   166
hgs
parents:
diff changeset
   167
    if ( !aReplyNeeded )
hgs
parents:
diff changeset
   168
        {
hgs
parents:
diff changeset
   169
        TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   170
        return;
hgs
parents:
diff changeset
   171
        }
hgs
parents:
diff changeset
   172
hgs
parents:
diff changeset
   173
    if(iCurrentOperation != EIdle)  
hgs
parents:
diff changeset
   174
        {
hgs
parents:
diff changeset
   175
        // only one call at time allowed. If another one is passed in, 
hgs
parents:
diff changeset
   176
        // then cancel the previous and reply with an error.   
hgs
parents:
diff changeset
   177
        HandleCommandCancel(); 
hgs
parents:
diff changeset
   178
        CreateReply(EFalse); 
hgs
parents:
diff changeset
   179
        }
hgs
parents:
diff changeset
   180
    
hgs
parents:
diff changeset
   181
    if ( iCmdHandlerType == ECmdHandlerTypeUndefined )
hgs
parents:
diff changeset
   182
        {
hgs
parents:
diff changeset
   183
		CreateReply(EFalse); 
hgs
parents:
diff changeset
   184
		}
hgs
parents:
diff changeset
   185
hgs
parents:
diff changeset
   186
    if ( iCmdHandlerType == ECmdHandlerTypeTest )
hgs
parents:
diff changeset
   187
        {
hgs
parents:
diff changeset
   188
        // Collect network data and complete in RunL 
hgs
parents:
diff changeset
   189
        iRetrieveDetectedNetworks->StartV2(iStatus); 
hgs
parents:
diff changeset
   190
        iCurrentOperation = EListAvailableNetworkOperators; 
hgs
parents:
diff changeset
   191
        SetActive(); 
hgs
parents:
diff changeset
   192
        TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   193
        return;
hgs
parents:
diff changeset
   194
        }
hgs
parents:
diff changeset
   195
hgs
parents:
diff changeset
   196
/*
hgs
parents:
diff changeset
   197
Read command returns the current mode, the currently selected operator 
hgs
parents:
diff changeset
   198
and the current Access Technology. If no operator is selected, <format>, 
hgs
parents:
diff changeset
   199
<oper> and < AcT>  are omitted.
hgs
parents:
diff changeset
   200
*/
hgs
parents:
diff changeset
   201
    if ( iCmdHandlerType == ECmdHandlerTypeRead )
hgs
parents:
diff changeset
   202
        {
hgs
parents:
diff changeset
   203
        // Collect data in two steps. First read operator name. Continue in RunL() 
hgs
parents:
diff changeset
   204
        RMobilePhone::TMobilePhoneNetworkSelectionV1 selection; 
hgs
parents:
diff changeset
   205
        RMobilePhone::TMobilePhoneNetworkSelectionV1Pckg nwSelectionSetting(selection); 
hgs
parents:
diff changeset
   206
        iPhone.GetNetworkSelectionSetting(nwSelectionSetting);
hgs
parents:
diff changeset
   207
        switch(selection.iMethod)
hgs
parents:
diff changeset
   208
            {
hgs
parents:
diff changeset
   209
            case RMobilePhone::ENetworkSelectionAutomatic: 
hgs
parents:
diff changeset
   210
                iRegistrationMode = EModeAutomatic;
hgs
parents:
diff changeset
   211
                break; 
hgs
parents:
diff changeset
   212
            case RMobilePhone::ENetworkSelectionManual: 
hgs
parents:
diff changeset
   213
                iRegistrationMode = EModeManual;
hgs
parents:
diff changeset
   214
                break; 
hgs
parents:
diff changeset
   215
            default: 
hgs
parents:
diff changeset
   216
                // Cannot get a known selection mode! 
hgs
parents:
diff changeset
   217
                TRACE_INFO(_L("CATCOPSCmd::HandleCommand() -- Cannot get a known selection mode!"));
hgs
parents:
diff changeset
   218
                CreateReply(EFalse); 
hgs
parents:
diff changeset
   219
                TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   220
                return; 
hgs
parents:
diff changeset
   221
            }
hgs
parents:
diff changeset
   222
        RMobilePhone::TMobilePhoneNetworkInfoV2Pckg nwInfo(iNetworkInfo); 
hgs
parents:
diff changeset
   223
        iPhone.GetCurrentNetwork(iStatus, nwInfo); 
hgs
parents:
diff changeset
   224
        iCurrentOperation = EGetNetworkInfoOperatorName; 
hgs
parents:
diff changeset
   225
		SetActive(); 
hgs
parents:
diff changeset
   226
        TRACE_INFO((_L("CATCOPSCmd::HandleCommand() starting operation (%d)"), iCurrentOperation));
hgs
parents:
diff changeset
   227
        TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   228
        return;
hgs
parents:
diff changeset
   229
        }
hgs
parents:
diff changeset
   230
hgs
parents:
diff changeset
   231
    // Getting this far means ECmdHandlerTypeSet. There must be parameter(s), too.   
hgs
parents:
diff changeset
   232
    TRAPD(err, ExtractParametersL(aCmd)); 
hgs
parents:
diff changeset
   233
hgs
parents:
diff changeset
   234
    // Check that we got some parameters, at least the "mode". If not, return an error: 
hgs
parents:
diff changeset
   235
	if(iParamArray.Count() < KMinimumParameterCountWhenModePresent) 
hgs
parents:
diff changeset
   236
        {
hgs
parents:
diff changeset
   237
        // Return error response, there were no parameters! 
hgs
parents:
diff changeset
   238
        TRACE_INFO(_L("CATCOPSCmd::HandleCommand() -- no parameters!"));
hgs
parents:
diff changeset
   239
        CreateReply(EFalse); 
hgs
parents:
diff changeset
   240
        TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   241
        return; 
hgs
parents:
diff changeset
   242
        }
hgs
parents:
diff changeset
   243
hgs
parents:
diff changeset
   244
	// At least the mode parameter is present at this point. Inspect it and check other parameters. 
hgs
parents:
diff changeset
   245
	TNetworkRegistrationMode mode; 
hgs
parents:
diff changeset
   246
	err = GetModeAndCheckParameterCount(iParamArray[KModeParameterIndex]->Des(), mode); 
hgs
parents:
diff changeset
   247
	if(err != KErrNone) 
hgs
parents:
diff changeset
   248
		{
hgs
parents:
diff changeset
   249
        // Return error response, invalid mode or other parameters! 
hgs
parents:
diff changeset
   250
		TRACE_INFO(_L("CATCOPSCmd::HandleCommand() -- invalid mode or other parameters!"));
hgs
parents:
diff changeset
   251
        CreateReply(EFalse); 
hgs
parents:
diff changeset
   252
	    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   253
        return; 
hgs
parents:
diff changeset
   254
		}
hgs
parents:
diff changeset
   255
hgs
parents:
diff changeset
   256
    // At this point the iRegistrationMode is stored and the parameters are valid. 
hgs
parents:
diff changeset
   257
	iRegistrationMode = mode; 
hgs
parents:
diff changeset
   258
	TRACE_INFO(( _L("CATCOPSCmd::HandleCommand() mode stored (%d)"), iRegistrationMode));
hgs
parents:
diff changeset
   259
		
hgs
parents:
diff changeset
   260
	if(iParamArray.Count() > 1) 
hgs
parents:
diff changeset
   261
		{
hgs
parents:
diff changeset
   262
		// If also format is present, extract it and store for later reference. 
hgs
parents:
diff changeset
   263
        RMmCustomAPI::TOperatorNameType format;
hgs
parents:
diff changeset
   264
        err = GetFormatFromParameter(iParamArray[KFormatParameterIndex]->Des(), format); 
hgs
parents:
diff changeset
   265
		if(err != KErrNone) 
hgs
parents:
diff changeset
   266
		    {
hgs
parents:
diff changeset
   267
		    // Return an error, invalid format. 
hgs
parents:
diff changeset
   268
			// Previously set format is still in use. 
hgs
parents:
diff changeset
   269
	 		TRACE_INFO(_L("CATCOPSCmd::HandleCommand() -- invalid format!"));
hgs
parents:
diff changeset
   270
            CreateReply(EFalse); 
hgs
parents:
diff changeset
   271
	 		TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   272
			return; 
hgs
parents:
diff changeset
   273
			}
hgs
parents:
diff changeset
   274
		// Format parameter is OK, keep it.
hgs
parents:
diff changeset
   275
		iFormat = format;  
hgs
parents:
diff changeset
   276
		TRACE_INFO(( _L("CATCOPSCmd::HandleCommand() format stored (%d)"), iFormat));
hgs
parents:
diff changeset
   277
		}
hgs
parents:
diff changeset
   278
hgs
parents:
diff changeset
   279
	// We're done with the required parameters, it's time to start processing the command. 
hgs
parents:
diff changeset
   280
	// So do a self complete and continue in RunL(): 
hgs
parents:
diff changeset
   281
	iReply = &aReply;  // Store the reply for later reference in RunL. 
hgs
parents:
diff changeset
   282
	iCurrentOperation = EInspectModeAndProcessCommand; 
hgs
parents:
diff changeset
   283
	TRequestStatus *status = &iStatus;  
hgs
parents:
diff changeset
   284
	User::RequestComplete(status, KErrNone); 
hgs
parents:
diff changeset
   285
	SetActive(); 
hgs
parents:
diff changeset
   286
	TRACE_INFO((_L("CATCOPSCmd::HandleCommand() starting operation (%d)"), iCurrentOperation));
hgs
parents:
diff changeset
   287
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   288
    }
hgs
parents:
diff changeset
   289
hgs
parents:
diff changeset
   290
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   291
// Parses the aCmd parameter and stores results in iParamArray.
hgs
parents:
diff changeset
   292
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   293
//
hgs
parents:
diff changeset
   294
void CATCOPSCmd::ExtractParametersL(const TDesC8& aCmd) 
hgs
parents:
diff changeset
   295
	{
hgs
parents:
diff changeset
   296
    TRACE_FUNC_ENTRY
hgs
parents:
diff changeset
   297
hgs
parents:
diff changeset
   298
    TRACE_INFO(( _L8("CATCOPSCmd::ExtractParameters() extracting (%S)"), &aCmd));
hgs
parents:
diff changeset
   299
hgs
parents:
diff changeset
   300
    TPtrC8 parameters = aCmd.Right(aCmd.Length() - KCOPSSetCmd().Length()); 
hgs
parents:
diff changeset
   301
hgs
parents:
diff changeset
   302
    iParamArray.ResetAndDestroy(); 
hgs
parents:
diff changeset
   303
hgs
parents:
diff changeset
   304
    // Parse the parameters into the parameter array: 
hgs
parents:
diff changeset
   305
    TInt separatorPos;  
hgs
parents:
diff changeset
   306
    while((separatorPos = parameters.Locate(',')) != KErrNotFound)
hgs
parents:
diff changeset
   307
        {
hgs
parents:
diff changeset
   308
        TRACE_INFO(( _L("CATCOPSCmd::ExtractParameters() separator position (%d)"), separatorPos));
hgs
parents:
diff changeset
   309
        TPtrC8 param = parameters.Left(separatorPos);
hgs
parents:
diff changeset
   310
        parameters.Set(parameters.Right(parameters.Length() - (separatorPos + 1))); // Remove the extracted part + separator 
hgs
parents:
diff changeset
   311
        HBufC8 *heapParam = param.AllocL();    
hgs
parents:
diff changeset
   312
        CleanupStack::PushL( heapParam );
hgs
parents:
diff changeset
   313
        // Strip the quotation marks from the parameter: 
hgs
parents:
diff changeset
   314
        TPtr8 ptr = heapParam->Des(); 
hgs
parents:
diff changeset
   315
        RemoveQuotationMarks(ptr); 
hgs
parents:
diff changeset
   316
        TRACE_INFO(( _L8("CATCOPSCmd::ExtractParameters() appending (%S)"), &ptr));
hgs
parents:
diff changeset
   317
        iParamArray.Append(heapParam); 
hgs
parents:
diff changeset
   318
        CleanupStack::Pop( heapParam );
hgs
parents:
diff changeset
   319
        }
hgs
parents:
diff changeset
   320
hgs
parents:
diff changeset
   321
    // Finally append the last piece of parameters: 
hgs
parents:
diff changeset
   322
    HBufC8 *param = parameters.AllocL(); 
hgs
parents:
diff changeset
   323
    CleanupStack::PushL( param );
hgs
parents:
diff changeset
   324
    TPtr8 ptr = param->Des(); 
hgs
parents:
diff changeset
   325
    RemoveQuotationMarks(ptr); 
hgs
parents:
diff changeset
   326
    TRACE_INFO(( _L8("CATCOPSCmd::ExtractParameters() appending (%S)"), &ptr));
hgs
parents:
diff changeset
   327
    iParamArray.Append(param); 
hgs
parents:
diff changeset
   328
    CleanupStack::Pop( param );
hgs
parents:
diff changeset
   329
hgs
parents:
diff changeset
   330
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   331
	}
hgs
parents:
diff changeset
   332
hgs
parents:
diff changeset
   333
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   334
// Strips all quotation parms from the string passed in. 
hgs
parents:
diff changeset
   335
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   336
//
hgs
parents:
diff changeset
   337
void CATCOPSCmd::RemoveQuotationMarks(TPtr8& aParameter) 
hgs
parents:
diff changeset
   338
    {
hgs
parents:
diff changeset
   339
    TRACE_FUNC_ENTRY
hgs
parents:
diff changeset
   340
    // Strip the quotation marks from the parameter: 
hgs
parents:
diff changeset
   341
    TInt quotePos;  
hgs
parents:
diff changeset
   342
    while((quotePos = aParameter.Locate('"')) != KErrNotFound)
hgs
parents:
diff changeset
   343
    {
hgs
parents:
diff changeset
   344
        aParameter.Delete(quotePos,1); 
hgs
parents:
diff changeset
   345
    }
hgs
parents:
diff changeset
   346
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   347
    }
hgs
parents:
diff changeset
   348
hgs
parents:
diff changeset
   349
hgs
parents:
diff changeset
   350
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   351
// Returns the selected mode in aMode and checks the parameter count. 
hgs
parents:
diff changeset
   352
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   353
//
hgs
parents:
diff changeset
   354
TInt CATCOPSCmd::GetModeAndCheckParameterCount(const TDesC8& aParameter, TNetworkRegistrationMode &aMode) 
hgs
parents:
diff changeset
   355
	{
hgs
parents:
diff changeset
   356
  TRACE_FUNC_ENTRY
hgs
parents:
diff changeset
   357
	TLex8 lex;
hgs
parents:
diff changeset
   358
	lex.Assign(aParameter);
hgs
parents:
diff changeset
   359
	TInt mode(0); 
hgs
parents:
diff changeset
   360
hgs
parents:
diff changeset
   361
	TInt err = lex.Val(mode); 
hgs
parents:
diff changeset
   362
	TRACE_INFO(( _L("CATCOPSCmd::GetModeAndCheckParameterCount() mode (%d)"), mode));
hgs
parents:
diff changeset
   363
hgs
parents:
diff changeset
   364
	if( err != KErrNone )
hgs
parents:
diff changeset
   365
		{
hgs
parents:
diff changeset
   366
        TRACE_INFO(_L("CATCOPSCmd::GetModeAndCheckParameterCount() TLex error!)"));
hgs
parents:
diff changeset
   367
        TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   368
        return KErrArgument; 
hgs
parents:
diff changeset
   369
		}			
hgs
parents:
diff changeset
   370
hgs
parents:
diff changeset
   371
  if(mode < EModeAutomatic || mode > EModeManualAutomatic || mode == EModeDeregister)
hgs
parents:
diff changeset
   372
      {
hgs
parents:
diff changeset
   373
      // Not a valid mode. 
hgs
parents:
diff changeset
   374
      TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   375
      return KErrArgument; 
hgs
parents:
diff changeset
   376
      }
hgs
parents:
diff changeset
   377
hgs
parents:
diff changeset
   378
  if( (mode == EModeManual || mode == EModeManualAutomatic)  &&  iParamArray.Count() < KMinimumParameterCountWhenOperatorPresent )
hgs
parents:
diff changeset
   379
      {
hgs
parents:
diff changeset
   380
      // Valid modes but not enough parameters. At least format and operator needed.  
hgs
parents:
diff changeset
   381
      TRACE_INFO(( _L("CATCOPSCmd::GetModeAndCheckParameterCount() not enough parameters (%d)"), iParamArray.Count()));
hgs
parents:
diff changeset
   382
      TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   383
      return KErrArgument; 
hgs
parents:
diff changeset
   384
      }
hgs
parents:
diff changeset
   385
  if( mode == EModeSetFormatParameter && iParamArray.Count() < KMinimumParameterCountWhenFormatPresent )
hgs
parents:
diff changeset
   386
      {
hgs
parents:
diff changeset
   387
      // Valid mode, but not enough parameters. Format is needed.  
hgs
parents:
diff changeset
   388
      TRACE_INFO(_L("CATCOPSCmd::GetModeAndCheckParameterCount() no format parameter)"));
hgs
parents:
diff changeset
   389
      TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   390
      return KErrArgument; 
hgs
parents:
diff changeset
   391
      }
hgs
parents:
diff changeset
   392
hgs
parents:
diff changeset
   393
  // Valid mode and enough parameters. 
hgs
parents:
diff changeset
   394
  aMode = static_cast<TNetworkRegistrationMode>(mode);
hgs
parents:
diff changeset
   395
hgs
parents:
diff changeset
   396
	TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   397
	return KErrNone; 
hgs
parents:
diff changeset
   398
	}
hgs
parents:
diff changeset
   399
hgs
parents:
diff changeset
   400
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   401
// Converts an AT command parameter to numeric format value and checks it is valid. 
hgs
parents:
diff changeset
   402
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   403
//
hgs
parents:
diff changeset
   404
TInt CATCOPSCmd::GetFormatFromParameter(const TDesC8& aParameter, RMmCustomAPI::TOperatorNameType &aFormat) 
hgs
parents:
diff changeset
   405
	{
hgs
parents:
diff changeset
   406
    TRACE_FUNC_ENTRY
hgs
parents:
diff changeset
   407
    TLex8 lex;
hgs
parents:
diff changeset
   408
    lex.Assign(aParameter);
hgs
parents:
diff changeset
   409
    TInt format(0); 
hgs
parents:
diff changeset
   410
    TInt err = lex.Val(format); 
hgs
parents:
diff changeset
   411
hgs
parents:
diff changeset
   412
    if(err != KErrNone)
hgs
parents:
diff changeset
   413
        {
hgs
parents:
diff changeset
   414
        TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   415
        return KErrArgument; 
hgs
parents:
diff changeset
   416
        }
hgs
parents:
diff changeset
   417
    switch(format)
hgs
parents:
diff changeset
   418
        {
hgs
parents:
diff changeset
   419
        case EFormatLong: // long by 3GPP TS 27.007 V8.4.1  
hgs
parents:
diff changeset
   420
            TRACE_INFO(_L("Format is long by 3GPP TS 27.007 V8.4.1"));
hgs
parents:
diff changeset
   421
            aFormat = RMmCustomAPI::EOperatorNameNitzFull; 
hgs
parents:
diff changeset
   422
            break; 
hgs
parents:
diff changeset
   423
        case EFormatShort: // short by 3GPP TS 27.007 V8.4.1 
hgs
parents:
diff changeset
   424
            TRACE_INFO(_L("Format is short by 3GPP TS 27.007 V8.4.1"));
hgs
parents:
diff changeset
   425
            aFormat = RMmCustomAPI::EOperatorNameNitzShort; 
hgs
parents:
diff changeset
   426
            break; 
hgs
parents:
diff changeset
   427
        case EFormatNumeric: // numeric by 3GPP TS 27.007 V8.4.1 
hgs
parents:
diff changeset
   428
            TRACE_INFO(_L("Format is numeric by 3GPP TS 27.007 V8.4.1"));
hgs
parents:
diff changeset
   429
            aFormat = RMmCustomAPI::EOperatorNameMccMnc; 
hgs
parents:
diff changeset
   430
            // Operator is numeric, conver it into S60 style. 
hgs
parents:
diff changeset
   431
            break; 
hgs
parents:
diff changeset
   432
        default: 
hgs
parents:
diff changeset
   433
            TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   434
            return KErrArgument;
hgs
parents:
diff changeset
   435
        }
hgs
parents:
diff changeset
   436
hgs
parents:
diff changeset
   437
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   438
    return KErrNone; 
hgs
parents:
diff changeset
   439
    }
hgs
parents:
diff changeset
   440
hgs
parents:
diff changeset
   441
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   442
// Converts an AT command parameter to numeric access technology value and checks it is valid. 
hgs
parents:
diff changeset
   443
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   444
//
hgs
parents:
diff changeset
   445
TInt CATCOPSCmd::GetAccTechFromParameter(const TDesC8& aParameter, TAccessTechnology& aAccTech) 
hgs
parents:
diff changeset
   446
    {
hgs
parents:
diff changeset
   447
    TRACE_FUNC_ENTRY
hgs
parents:
diff changeset
   448
    TLex8 lex;
hgs
parents:
diff changeset
   449
    lex.Assign(aParameter);
hgs
parents:
diff changeset
   450
    TInt accTech(0); 
hgs
parents:
diff changeset
   451
    TInt err = lex.Val(accTech); 
hgs
parents:
diff changeset
   452
hgs
parents:
diff changeset
   453
    if(err != KErrNone)
hgs
parents:
diff changeset
   454
        {
hgs
parents:
diff changeset
   455
        TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   456
        return KErrArgument; 
hgs
parents:
diff changeset
   457
        }
hgs
parents:
diff changeset
   458
hgs
parents:
diff changeset
   459
    if(accTech != EGSM && accTech != EUDMA) // The only allowed access technologies. 
hgs
parents:
diff changeset
   460
        {
hgs
parents:
diff changeset
   461
        TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   462
        return KErrArgument; 
hgs
parents:
diff changeset
   463
        }
hgs
parents:
diff changeset
   464
 
hgs
parents:
diff changeset
   465
    aAccTech = static_cast<TAccessTechnology>(accTech);
hgs
parents:
diff changeset
   466
hgs
parents:
diff changeset
   467
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   468
    return KErrNone; 
hgs
parents:
diff changeset
   469
    }
hgs
parents:
diff changeset
   470
hgs
parents:
diff changeset
   471
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   472
// Converts an AT command parameter to ETel compatible operator values 
hgs
parents:
diff changeset
   473
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   474
//
hgs
parents:
diff changeset
   475
TInt CATCOPSCmd::ConvertOperatorToMccMnc(const CMobilePhoneNetworkListV2 *aDetectedNetworks, 
hgs
parents:
diff changeset
   476
                                        const RMmCustomAPI::TOperatorNameType aFormat, 
hgs
parents:
diff changeset
   477
                                        const TBuf<KMaxOperatorNameLength>& aOperatorParameter, 
hgs
parents:
diff changeset
   478
                                        RMobilePhone::TMobilePhoneNetworkCountryCode& aMcc, 
hgs
parents:
diff changeset
   479
                                        RMobilePhone::TMobilePhoneNetworkIdentity& aMnc) 
hgs
parents:
diff changeset
   480
    {
hgs
parents:
diff changeset
   481
    TRACE_FUNC_ENTRY
hgs
parents:
diff changeset
   482
hgs
parents:
diff changeset
   483
    if(aFormat == RMmCustomAPI::EOperatorNameMccMnc) 
hgs
parents:
diff changeset
   484
        {
hgs
parents:
diff changeset
   485
        // Check first that there are at least five characters passed in. 
hgs
parents:
diff changeset
   486
       	TChar nextChar; 
hgs
parents:
diff changeset
   487
        if(aOperatorParameter.Length() < 5)
hgs
parents:
diff changeset
   488
        	{
hgs
parents:
diff changeset
   489
			return KErrArgument; 
hgs
parents:
diff changeset
   490
        	}
hgs
parents:
diff changeset
   491
        for(int i = 0; i < 5; ++i)
hgs
parents:
diff changeset
   492
        	{
hgs
parents:
diff changeset
   493
            nextChar = aOperatorParameter[i]; 
hgs
parents:
diff changeset
   494
            if(!nextChar.IsDigit()) 
hgs
parents:
diff changeset
   495
                {
hgs
parents:
diff changeset
   496
                return KErrArgument; 
hgs
parents:
diff changeset
   497
                }
hgs
parents:
diff changeset
   498
      		}
hgs
parents:
diff changeset
   499
        // Operator is in three digit country code + two digit network code format.  
hgs
parents:
diff changeset
   500
	    // Must be converted to ETel style. The possible extra will be simply discarded. 
hgs
parents:
diff changeset
   501
     	TRACE_INFO(_L("CATCOPSCmd::ConvertOperatorToMccMnc() operator is all digits, convert it into ETel data types."));
hgs
parents:
diff changeset
   502
	    aMcc.Copy(aOperatorParameter.Left(3)); 
hgs
parents:
diff changeset
   503
	    aMnc.Copy(aOperatorParameter.Right(2)); 
hgs
parents:
diff changeset
   504
	    }
hgs
parents:
diff changeset
   505
    else  // The short or long text string formats. 
hgs
parents:
diff changeset
   506
        {
hgs
parents:
diff changeset
   507
        // Find the requested operator from the operator array.  
hgs
parents:
diff changeset
   508
        // If array is empty, return an error. 
hgs
parents:
diff changeset
   509
        if(!aDetectedNetworks)
hgs
parents:
diff changeset
   510
            {
hgs
parents:
diff changeset
   511
            TRACE_INFO(_L("CATCOPSCmd::ConvertOperatorToMccMnc() No detected networks!"));
hgs
parents:
diff changeset
   512
            TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   513
            return KErrNotFound; 
hgs
parents:
diff changeset
   514
            }
hgs
parents:
diff changeset
   515
hgs
parents:
diff changeset
   516
        RMobilePhone::TMobilePhoneNetworkInfoV2 nwInfo; 
hgs
parents:
diff changeset
   517
        for(TInt i=0; i < iDetectedNetworks->Enumerate(); ++i)
hgs
parents:
diff changeset
   518
            {
hgs
parents:
diff changeset
   519
            TRAPD(err, nwInfo = iDetectedNetworks->GetEntryL(i))  
hgs
parents:
diff changeset
   520
            if(err != KErrNone)
hgs
parents:
diff changeset
   521
                {
hgs
parents:
diff changeset
   522
                return KErrNotFound; 
hgs
parents:
diff changeset
   523
                }
hgs
parents:
diff changeset
   524
hgs
parents:
diff changeset
   525
            if(aFormat == RMmCustomAPI::EOperatorNameNitzShort)
hgs
parents:
diff changeset
   526
                {
hgs
parents:
diff changeset
   527
                TRACE_INFO(_L("CATCOPSCmd::ConvertOperatorToMccMnc() Operator is in short format, comparing."));
hgs
parents:
diff changeset
   528
                if(nwInfo.iShortName.Compare(aOperatorParameter) == 0)
hgs
parents:
diff changeset
   529
                    {
hgs
parents:
diff changeset
   530
                    TRACE_INFO(_L("Match found."));
hgs
parents:
diff changeset
   531
                    aMcc = nwInfo.iCountryCode; 
hgs
parents:
diff changeset
   532
                    aMnc = nwInfo.iNetworkId; 
hgs
parents:
diff changeset
   533
                    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   534
                    return KErrNone; 
hgs
parents:
diff changeset
   535
                    } 
hgs
parents:
diff changeset
   536
                }
hgs
parents:
diff changeset
   537
            else if(aFormat == RMmCustomAPI::EOperatorNameNitzFull)
hgs
parents:
diff changeset
   538
                {
hgs
parents:
diff changeset
   539
                TRACE_INFO(_L("CATCOPSCmd::ConvertOperatorToMccMnc() Operator is in long format, comparing."));
hgs
parents:
diff changeset
   540
                if(nwInfo.iLongName.Compare(aOperatorParameter) == 0)
hgs
parents:
diff changeset
   541
                    {
hgs
parents:
diff changeset
   542
                    TRACE_INFO(_L("Match found."));
hgs
parents:
diff changeset
   543
                    aMcc = nwInfo.iCountryCode; 
hgs
parents:
diff changeset
   544
                    aMnc = nwInfo.iNetworkId; 
hgs
parents:
diff changeset
   545
                    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   546
                    return KErrNone; 
hgs
parents:
diff changeset
   547
                    } 
hgs
parents:
diff changeset
   548
                }
hgs
parents:
diff changeset
   549
            else        
hgs
parents:
diff changeset
   550
                {
hgs
parents:
diff changeset
   551
                TRACE_INFO(_L("CATCOPSCmd::ConvertOperatorToMccMnc() Unknown operator format!"));
hgs
parents:
diff changeset
   552
                TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   553
                return KErrArgument; 
hgs
parents:
diff changeset
   554
                }
hgs
parents:
diff changeset
   555
            }
hgs
parents:
diff changeset
   556
        TRACE_INFO(_L("CATCOPSCmd::ConvertOperatorToMccMnc() Operator was not found in list!"));
hgs
parents:
diff changeset
   557
        TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   558
        return KErrNotFound; 
hgs
parents:
diff changeset
   559
        }
hgs
parents:
diff changeset
   560
hgs
parents:
diff changeset
   561
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   562
    return KErrNone; 
hgs
parents:
diff changeset
   563
    }
hgs
parents:
diff changeset
   564
hgs
parents:
diff changeset
   565
hgs
parents:
diff changeset
   566
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   567
// Initiates an automatic network registration.  
hgs
parents:
diff changeset
   568
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   569
//
hgs
parents:
diff changeset
   570
void CATCOPSCmd::AutomaticNetworkRegistration() 
hgs
parents:
diff changeset
   571
    {
hgs
parents:
diff changeset
   572
    TRACE_FUNC_ENTRY
hgs
parents:
diff changeset
   573
    RMobilePhone::TMobilePhoneNetworkManualSelection nwInfo; 
hgs
parents:
diff changeset
   574
	iCurrentOperation = EAutomaticallyRegisterToNetwork; 
hgs
parents:
diff changeset
   575
	nwInfo.iCountry = KNullDesC;
hgs
parents:
diff changeset
   576
	nwInfo.iNetwork = KNullDesC;
hgs
parents:
diff changeset
   577
	iPhone.SelectNetwork(iStatus, EFalse, nwInfo); 
hgs
parents:
diff changeset
   578
	SetActive();  // Response will be sent in RunL 
hgs
parents:
diff changeset
   579
	TRACE_INFO((_L("CATCOPSCmd::HandleCommand() starting operation (%d)"), iCurrentOperation));
hgs
parents:
diff changeset
   580
	TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   581
	}
hgs
parents:
diff changeset
   582
hgs
parents:
diff changeset
   583
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   584
// Initiates a manual network registration.  
hgs
parents:
diff changeset
   585
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   586
//
hgs
parents:
diff changeset
   587
void CATCOPSCmd::ManualNetworkRegistration(const RMobilePhone::TMobilePhoneNetworkCountryCode& aMcc, 
hgs
parents:
diff changeset
   588
                                           const RMobilePhone::TMobilePhoneNetworkIdentity& aMnc) 
hgs
parents:
diff changeset
   589
    {
hgs
parents:
diff changeset
   590
	TRACE_FUNC_ENTRY
hgs
parents:
diff changeset
   591
	RMobilePhone::TMobilePhoneNetworkManualSelection nwInfo; 
hgs
parents:
diff changeset
   592
	iCurrentOperation = EManuallyRegisterToNetwork; 
hgs
parents:
diff changeset
   593
	nwInfo.iCountry.Append(aMcc);
hgs
parents:
diff changeset
   594
	nwInfo.iNetwork.Append(aMnc);
hgs
parents:
diff changeset
   595
	iPhone.SelectNetwork(iStatus, ETrue, nwInfo); 
hgs
parents:
diff changeset
   596
	SetActive(); 	// Response will be sent in RunL 
hgs
parents:
diff changeset
   597
	TRACE_INFO((_L("CATCOPSCmd::HandleCommand() starting operation (%d)"), iCurrentOperation));
hgs
parents:
diff changeset
   598
	TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   599
    }
hgs
parents:
diff changeset
   600
hgs
parents:
diff changeset
   601
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   602
// Initiates a manual network registration and access technology selection.  
hgs
parents:
diff changeset
   603
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   604
//
hgs
parents:
diff changeset
   605
void CATCOPSCmd::ManualNetworkRegistration(const RMobilePhone::TMobilePhoneNetworkCountryCode& aMcc, 
hgs
parents:
diff changeset
   606
                                           const RMobilePhone::TMobilePhoneNetworkIdentity& aMnc, 
hgs
parents:
diff changeset
   607
                                           const TAccessTechnology aAccTech) 
hgs
parents:
diff changeset
   608
    {
hgs
parents:
diff changeset
   609
    TRACE_FUNC_ENTRY
hgs
parents:
diff changeset
   610
	// Store access technology for later reference: 
hgs
parents:
diff changeset
   611
    iAccTech = aAccTech; 
hgs
parents:
diff changeset
   612
	// Call another overload to start the first phase of the operation: 
hgs
parents:
diff changeset
   613
	ManualNetworkRegistration(aMcc, aMnc); 
hgs
parents:
diff changeset
   614
	// Set the state again so the RunL knows to launch the next phase: 
hgs
parents:
diff changeset
   615
	iCurrentOperation = EManuallyRegisterToNetworkAndChooseAccTech; 
hgs
parents:
diff changeset
   616
  	TRACE_INFO((_L("CATCOPSCmd::HandleCommand() starting operation (%d)"), iCurrentOperation));
hgs
parents:
diff changeset
   617
	TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   618
    }
hgs
parents:
diff changeset
   619
hgs
parents:
diff changeset
   620
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   621
// CATCOPSCmd::RunL 
hgs
parents:
diff changeset
   622
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   623
//
hgs
parents:
diff changeset
   624
void CATCOPSCmd::RunL()
hgs
parents:
diff changeset
   625
    {
hgs
parents:
diff changeset
   626
    TRACE_FUNC_ENTRY
hgs
parents:
diff changeset
   627
	TInt err = KErrNone; 
hgs
parents:
diff changeset
   628
	if(iStatus != KErrNone)   
hgs
parents:
diff changeset
   629
	    {
hgs
parents:
diff changeset
   630
        HandleError(); 
hgs
parents:
diff changeset
   631
	    }
hgs
parents:
diff changeset
   632
    // Proceed to next step or return a response if all is done.
hgs
parents:
diff changeset
   633
    switch(iCurrentOperation)
hgs
parents:
diff changeset
   634
        {
hgs
parents:
diff changeset
   635
        case EListAvailableNetworkOperators: 
hgs
parents:
diff changeset
   636
            TRACE_INFO((_L("CATCOPSCmd::HandleCommand() completing operation (%d)"), iCurrentOperation));
hgs
parents:
diff changeset
   637
            if(iDetectedNetworks)
hgs
parents:
diff changeset
   638
                {
hgs
parents:
diff changeset
   639
                delete iDetectedNetworks;
hgs
parents:
diff changeset
   640
                iDetectedNetworks = NULL; 
hgs
parents:
diff changeset
   641
                }
hgs
parents:
diff changeset
   642
            iDetectedNetworks = iRetrieveDetectedNetworks->RetrieveListV2L(); 
hgs
parents:
diff changeset
   643
            // Then create a response. 
hgs
parents:
diff changeset
   644
            TRAP(err, ConstructNetworkListResponseL()); 
hgs
parents:
diff changeset
   645
            if(err != KErrNone)
hgs
parents:
diff changeset
   646
                {
hgs
parents:
diff changeset
   647
                // An error here means that no response has been sent. Reply with an error. 
hgs
parents:
diff changeset
   648
                CreateReply(EFalse); 
hgs
parents:
diff changeset
   649
                }
hgs
parents:
diff changeset
   650
            break; 
hgs
parents:
diff changeset
   651
        
hgs
parents:
diff changeset
   652
        case EInspectModeAndProcessCommand: 
hgs
parents:
diff changeset
   653
            // Check the mode and act accordingly 
hgs
parents:
diff changeset
   654
            TRACE_INFO((_L("CATCOPSCmd::HandleCommand() completing operation (%d)"), iCurrentOperation));
hgs
parents:
diff changeset
   655
            err = InspectModeAndProcessCommand(); 
hgs
parents:
diff changeset
   656
            if(err != KErrNone)
hgs
parents:
diff changeset
   657
                {
hgs
parents:
diff changeset
   658
                CreateReply(EFalse); 
hgs
parents:
diff changeset
   659
                }
hgs
parents:
diff changeset
   660
            break; 
hgs
parents:
diff changeset
   661
hgs
parents:
diff changeset
   662
        case EGetNetworkInfoOperatorName: 
hgs
parents:
diff changeset
   663
            if(ConstructNetworkInfoResponse() != KErrNone)
hgs
parents:
diff changeset
   664
                {
hgs
parents:
diff changeset
   665
                // An error means that no response has been sent. Reply with an error. 
hgs
parents:
diff changeset
   666
                CreateReply(EFalse); 
hgs
parents:
diff changeset
   667
                }
hgs
parents:
diff changeset
   668
            break; 
hgs
parents:
diff changeset
   669
hgs
parents:
diff changeset
   670
        case EManuallyRegisterToNetworkAndChooseAccTech: 
hgs
parents:
diff changeset
   671
            TRACE_INFO((_L("CATCOPSCmd::HandleCommand() completing operation (%d)"), iCurrentOperation));
hgs
parents:
diff changeset
   672
            switch(iAccTech)
hgs
parents:
diff changeset
   673
                {
hgs
parents:
diff changeset
   674
                case EGSM: 
hgs
parents:
diff changeset
   675
                    iCustomApi.SetSystemNetworkMode(iStatus, RMmCustomAPI::KCapsNetworkModeGsm);
hgs
parents:
diff changeset
   676
                    iCurrentOperation = ESetSystemNetworkBand; 
hgs
parents:
diff changeset
   677
                    SetActive(); 
hgs
parents:
diff changeset
   678
                    break; 
hgs
parents:
diff changeset
   679
                case EUDMA: 
hgs
parents:
diff changeset
   680
                    iCustomApi.SetSystemNetworkMode(iStatus, RMmCustomAPI::KCapsNetworkModeUmts);
hgs
parents:
diff changeset
   681
                    iCurrentOperation = ESetSystemNetworkBand; 
hgs
parents:
diff changeset
   682
                    SetActive(); 
hgs
parents:
diff changeset
   683
                    break; 
hgs
parents:
diff changeset
   684
                default:
hgs
parents:
diff changeset
   685
                    // No automatic registering requested, so send back an error response. 
hgs
parents:
diff changeset
   686
                    TRACE_INFO( _L("CATCOPSCmd::RunL() incorrect acc.tech., reply an error."));
hgs
parents:
diff changeset
   687
                    CreateReply(EFalse); 
hgs
parents:
diff changeset
   688
                }
hgs
parents:
diff changeset
   689
            TRACE_INFO((_L("CATCOPSCmd::HandleCommand() starting operation (%d)"), iCurrentOperation));
hgs
parents:
diff changeset
   690
            break; 
hgs
parents:
diff changeset
   691
hgs
parents:
diff changeset
   692
        case EManuallyRegisterToNetwork: 
hgs
parents:
diff changeset
   693
        case EAutomaticallyRegisterToNetwork: 
hgs
parents:
diff changeset
   694
        case ESetSystemNetworkBand: 
hgs
parents:
diff changeset
   695
            TRACE_INFO((_L("CATCOPSCmd::HandleCommand() completing operation (%d)"), iCurrentOperation));
hgs
parents:
diff changeset
   696
            // Last step completed successfully, so create OK response. 
hgs
parents:
diff changeset
   697
            CreateReply(ETrue); 
hgs
parents:
diff changeset
   698
            break; 
hgs
parents:
diff changeset
   699
hgs
parents:
diff changeset
   700
        default: 
hgs
parents:
diff changeset
   701
            TRACE_INFO(( _L("CATCOPSCmd::RunL() default operation (%d)!"), iCurrentOperation));
hgs
parents:
diff changeset
   702
            break; 
hgs
parents:
diff changeset
   703
        }
hgs
parents:
diff changeset
   704
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   705
    }
hgs
parents:
diff changeset
   706
hgs
parents:
diff changeset
   707
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   708
// Handles an error in async call. 
hgs
parents:
diff changeset
   709
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   710
//
hgs
parents:
diff changeset
   711
void CATCOPSCmd::HandleError()
hgs
parents:
diff changeset
   712
    {
hgs
parents:
diff changeset
   713
    TRACE_FUNC_ENTRY
hgs
parents:
diff changeset
   714
    TRACE_INFO(( _L("CATCOPSCmd::RunL() failure (%d) in operation (%d)!"), iStatus.Int(), iCurrentOperation));
hgs
parents:
diff changeset
   715
hgs
parents:
diff changeset
   716
    // In case of failure check the operation. In some cases failures are OK.
hgs
parents:
diff changeset
   717
    switch(iCurrentOperation)
hgs
parents:
diff changeset
   718
        {
hgs
parents:
diff changeset
   719
        case EManuallyRegisterToNetwork: 
hgs
parents:
diff changeset
   720
            if(iRegistrationMode == EModeManualAutomatic)
hgs
parents:
diff changeset
   721
                {
hgs
parents:
diff changeset
   722
                // Manual registration failed, try automatic next. 
hgs
parents:
diff changeset
   723
                TRACE_INFO( _L("CATCOPSCmd::RunL() registration mode manual automatic, try automatic."));
hgs
parents:
diff changeset
   724
                AutomaticNetworkRegistration(); 
hgs
parents:
diff changeset
   725
                }
hgs
parents:
diff changeset
   726
            else 
hgs
parents:
diff changeset
   727
                {
hgs
parents:
diff changeset
   728
                // No automatic registering requested, so send back an error response. 
hgs
parents:
diff changeset
   729
                TRACE_INFO( _L("CATCOPSCmd::RunL() reply an error."));
hgs
parents:
diff changeset
   730
                CreateReply(EFalse); 
hgs
parents:
diff changeset
   731
                }
hgs
parents:
diff changeset
   732
            break; 
hgs
parents:
diff changeset
   733
        case ESetSystemNetworkBand: 
hgs
parents:
diff changeset
   734
        case EManuallyRegisterToNetworkAndChooseAccTech: 
29
hgs
parents: 26
diff changeset
   735
			if(iRegistrationMode == EModeManualAutomatic)
hgs
parents: 26
diff changeset
   736
                {
hgs
parents: 26
diff changeset
   737
                // Manual registration failed, try automatic next. 
hgs
parents: 26
diff changeset
   738
                TRACE_INFO( _L("CATCOPSCmd::RunL() registration mode manual automatic, try automatic."));
hgs
parents: 26
diff changeset
   739
                AutomaticNetworkRegistration(); 
hgs
parents: 26
diff changeset
   740
				break;
hgs
parents: 26
diff changeset
   741
                }
hgs
parents: 26
diff changeset
   742
            else 
hgs
parents: 26
diff changeset
   743
                {
hgs
parents: 26
diff changeset
   744
				// Cannot set the access technology, so set it back to EAccTechNotSet. 
hgs
parents: 26
diff changeset
   745
				// This prevents replying to queries with outdated or incorrect acc tech information. 
hgs
parents: 26
diff changeset
   746
				TRACE_INFO( _L("CATCOPSCmd::RunL() couldn't set system network band, so reset access tech."));
hgs
parents: 26
diff changeset
   747
				iAccTech = EAccTechNotSet; 
hgs
parents: 26
diff changeset
   748
				// Fall through to default, because these require an error response. 
hgs
parents: 26
diff changeset
   749
				}
25
hgs
parents:
diff changeset
   750
        default: 
hgs
parents:
diff changeset
   751
            // In all other cases send back an error response. 
hgs
parents:
diff changeset
   752
            TRACE_INFO( _L("CATCOPSCmd::RunL() reply an error."));
hgs
parents:
diff changeset
   753
            CreateReply(EFalse); 
hgs
parents:
diff changeset
   754
            break; 
hgs
parents:
diff changeset
   755
        }
hgs
parents:
diff changeset
   756
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   757
    }
hgs
parents:
diff changeset
   758
hgs
parents:
diff changeset
   759
hgs
parents:
diff changeset
   760
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   761
// Cancels a pending HandleCommand request.
hgs
parents:
diff changeset
   762
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   763
//
hgs
parents:
diff changeset
   764
void CATCOPSCmd::HandleCommandCancel()
hgs
parents:
diff changeset
   765
    {
hgs
parents:
diff changeset
   766
    TRACE_FUNC_ENTRY
hgs
parents:
diff changeset
   767
    Cancel(); 
hgs
parents:
diff changeset
   768
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   769
    }
hgs
parents:
diff changeset
   770
hgs
parents:
diff changeset
   771
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   772
// CATCOPSCmd::DoCancel
hgs
parents:
diff changeset
   773
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   774
//
hgs
parents:
diff changeset
   775
void CATCOPSCmd::DoCancel()
hgs
parents:
diff changeset
   776
    {
hgs
parents:
diff changeset
   777
    TRACE_FUNC_ENTRY
hgs
parents:
diff changeset
   778
    switch(iCurrentOperation)
hgs
parents:
diff changeset
   779
        {
hgs
parents:
diff changeset
   780
        case EAutomaticallyRegisterToNetwork:
hgs
parents:
diff changeset
   781
        case EManuallyRegisterToNetwork:
hgs
parents:
diff changeset
   782
        case EManuallyRegisterToNetworkAndChooseAccTech:
hgs
parents:
diff changeset
   783
            iPhone.CancelAsyncRequest(EMobilePhoneSelectNetworkCancel);  
hgs
parents:
diff changeset
   784
            break; 
hgs
parents:
diff changeset
   785
        case EGetNetworkInfoOperatorName:
hgs
parents:
diff changeset
   786
            iPhone.CancelAsyncRequest(EMobilePhoneGetCurrentNetworkCancel);  
hgs
parents:
diff changeset
   787
            break; 
hgs
parents:
diff changeset
   788
        case ESetSystemNetworkBand:
hgs
parents:
diff changeset
   789
            iCustomApi.CancelAsyncRequest(ECustomSetSystemNetworkModeIPC); 
hgs
parents:
diff changeset
   790
            break; 
hgs
parents:
diff changeset
   791
        case EListAvailableNetworkOperators:
hgs
parents:
diff changeset
   792
            iRetrieveDetectedNetworks->Cancel();  
hgs
parents:
diff changeset
   793
            break; 
hgs
parents:
diff changeset
   794
        default: 
hgs
parents:
diff changeset
   795
            break; 
hgs
parents:
diff changeset
   796
        }
hgs
parents:
diff changeset
   797
hgs
parents:
diff changeset
   798
    iCurrentOperation = EIdle; 
hgs
parents:
diff changeset
   799
hgs
parents:
diff changeset
   800
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   801
    }
hgs
parents:
diff changeset
   802
hgs
parents:
diff changeset
   803
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   804
// Helper method for RunL() 
hgs
parents:
diff changeset
   805
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   806
//
hgs
parents:
diff changeset
   807
TInt CATCOPSCmd::InspectModeAndProcessCommand()
hgs
parents:
diff changeset
   808
    {
hgs
parents:
diff changeset
   809
    TRACE_FUNC_ENTRY
hgs
parents:
diff changeset
   810
    TBuf<KMaxOperatorNameLength> buf;
hgs
parents:
diff changeset
   811
    TInt err; 
hgs
parents:
diff changeset
   812
hgs
parents:
diff changeset
   813
    switch (iRegistrationMode)
hgs
parents:
diff changeset
   814
        {
hgs
parents:
diff changeset
   815
        case EModeAutomatic: 
hgs
parents:
diff changeset
   816
            AutomaticNetworkRegistration(); 
hgs
parents:
diff changeset
   817
            break; 
hgs
parents:
diff changeset
   818
        case EModeManual: 
hgs
parents:
diff changeset
   819
        case EModeManualAutomatic: // see also RunL() 
hgs
parents:
diff changeset
   820
            if(iParamArray.Count() < KMinimumParameterCountWhenOperatorPresent)
hgs
parents:
diff changeset
   821
                {
hgs
parents:
diff changeset
   822
                TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   823
                return KErrArgument; 
hgs
parents:
diff changeset
   824
                }
hgs
parents:
diff changeset
   825
            
hgs
parents:
diff changeset
   826
            // At least the operator is present, so convert it into S60 format. 
hgs
parents:
diff changeset
   827
            buf.Copy(iParamArray[KOperatorParameterIndex]->Des()); 
hgs
parents:
diff changeset
   828
            err = ConvertOperatorToMccMnc(iDetectedNetworks, iFormat, buf, iMcc, iMnc); 
hgs
parents:
diff changeset
   829
            if(err != KErrNone)
hgs
parents:
diff changeset
   830
                {
hgs
parents:
diff changeset
   831
                TRACE_INFO(_L("CATCOPSCmd::HandleCommand() -- operator conversion failed!"));
hgs
parents:
diff changeset
   832
                TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   833
                return KErrArgument; 
hgs
parents:
diff changeset
   834
                }
hgs
parents:
diff changeset
   835
hgs
parents:
diff changeset
   836
            if (iParamArray.Count() >= KMinimumParameterCountWhenAccTechPresent) 
hgs
parents:
diff changeset
   837
                {
hgs
parents:
diff changeset
   838
                // Also access tech. is present. Convert it to ETel compatible value.  
hgs
parents:
diff changeset
   839
                TAccessTechnology accTech; 
hgs
parents:
diff changeset
   840
                TInt err = GetAccTechFromParameter(iParamArray[KAccessTechnologyParameterIndex]->Des(), accTech); 
hgs
parents:
diff changeset
   841
                if(err != KErrNone)
hgs
parents:
diff changeset
   842
                    {
hgs
parents:
diff changeset
   843
                    // Parameter problem, return an error. 
hgs
parents:
diff changeset
   844
                    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   845
                    return KErrArgument; 
hgs
parents:
diff changeset
   846
                    }
hgs
parents:
diff changeset
   847
                // Register both operator and access technology manually.
hgs
parents:
diff changeset
   848
                ManualNetworkRegistration(iMcc, iMnc, accTech); 
hgs
parents:
diff changeset
   849
                }
hgs
parents:
diff changeset
   850
            else 
hgs
parents:
diff changeset
   851
                {
hgs
parents:
diff changeset
   852
                // No access technology parameter, so register just the operator. 
hgs
parents:
diff changeset
   853
                ManualNetworkRegistration(iMcc, iMnc); 
hgs
parents:
diff changeset
   854
                }
hgs
parents:
diff changeset
   855
            break; 
hgs
parents:
diff changeset
   856
        case EModeDeregister: // Deregister from network 
hgs
parents:
diff changeset
   857
            // Not supported, return an error. 
hgs
parents:
diff changeset
   858
			TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   859
            return KErrArgument; 
hgs
parents:
diff changeset
   860
        case EModeSetFormatParameter: 
hgs
parents:
diff changeset
   861
            // Storing format parameter was done already, so just reply OK. 
hgs
parents:
diff changeset
   862
            CreateReply(ETrue); 
hgs
parents:
diff changeset
   863
			TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   864
            return KErrNone; 
hgs
parents:
diff changeset
   865
        default: 
hgs
parents:
diff changeset
   866
            return KErrArgument; 
hgs
parents:
diff changeset
   867
        }
hgs
parents:
diff changeset
   868
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   869
    return KErrNone; 
hgs
parents:
diff changeset
   870
    }
hgs
parents:
diff changeset
   871
hgs
parents:
diff changeset
   872
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   873
// Converts the ETel access technology into 3GPP TS 27.007 V8.4.1 compatible format. 
hgs
parents:
diff changeset
   874
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   875
//
hgs
parents:
diff changeset
   876
TInt CATCOPSCmd::SolveAccessTechnology(RMobilePhone::TMobilePhoneNetworkAccess &aAccessTech)
hgs
parents:
diff changeset
   877
    {
hgs
parents:
diff changeset
   878
    TRACE_FUNC_ENTRY
hgs
parents:
diff changeset
   879
hgs
parents:
diff changeset
   880
    TUint caps;
hgs
parents:
diff changeset
   881
    if(iPacketService.GetStaticCaps(caps, RPacketContext::EPdpTypePPP) != KErrNone)
hgs
parents:
diff changeset
   882
        {
hgs
parents:
diff changeset
   883
        TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   884
        return KErrGeneral;     
hgs
parents:
diff changeset
   885
        }
hgs
parents:
diff changeset
   886
hgs
parents:
diff changeset
   887
    TRACE_INFO(( _L8("CATCOPSCmd::SolveAccessTechnology() static caps gotten (%b)"), caps));
hgs
parents:
diff changeset
   888
hgs
parents:
diff changeset
   889
    switch(aAccessTech)
hgs
parents:
diff changeset
   890
        {
hgs
parents:
diff changeset
   891
        case RMobilePhone::ENetworkAccessGsm: 
hgs
parents:
diff changeset
   892
            if(caps & RPacketService::KCapsEGPRSSupported)
hgs
parents:
diff changeset
   893
                {
hgs
parents:
diff changeset
   894
                iAccTech = EGSMwithEGPRS; 
hgs
parents:
diff changeset
   895
                }
hgs
parents:
diff changeset
   896
            else 
hgs
parents:
diff changeset
   897
                {
hgs
parents:
diff changeset
   898
                iAccTech = EGSM; 
hgs
parents:
diff changeset
   899
                }
hgs
parents:
diff changeset
   900
            break; 
hgs
parents:
diff changeset
   901
        case RMobilePhone::ENetworkAccessGsmCompact: 
hgs
parents:
diff changeset
   902
            iAccTech = EGSMCompact; 
hgs
parents:
diff changeset
   903
            break; 
hgs
parents:
diff changeset
   904
        case RMobilePhone::ENetworkAccessUtran: 
hgs
parents:
diff changeset
   905
            if(caps & RPacketService::KCapsHSDPASupported) 
hgs
parents:
diff changeset
   906
                {
hgs
parents:
diff changeset
   907
                if(caps & RPacketService::KCapsHSUPASupported)
hgs
parents:
diff changeset
   908
                    {
hgs
parents:
diff changeset
   909
                    iAccTech = EUDMAwithHSDPAandHSUPA;  
hgs
parents:
diff changeset
   910
                    }
hgs
parents:
diff changeset
   911
                else 
hgs
parents:
diff changeset
   912
                    {
hgs
parents:
diff changeset
   913
                    iAccTech = EHSDPA;  
hgs
parents:
diff changeset
   914
                    }
hgs
parents:
diff changeset
   915
                }
hgs
parents:
diff changeset
   916
            else if(caps & RPacketService::KCapsHSUPASupported) 
hgs
parents:
diff changeset
   917
                {
hgs
parents:
diff changeset
   918
                iAccTech = EHSUPA;  
hgs
parents:
diff changeset
   919
                }
hgs
parents:
diff changeset
   920
            else 
hgs
parents:
diff changeset
   921
                {
hgs
parents:
diff changeset
   922
                iAccTech = EUDMA;  
hgs
parents:
diff changeset
   923
                }
hgs
parents:
diff changeset
   924
            break;
hgs
parents:
diff changeset
   925
        default: 
hgs
parents:
diff changeset
   926
            TRACE_INFO( _L("CATCOPSCmd::SolveAccessTechnology() unknown access tech!"));
hgs
parents:
diff changeset
   927
            iAccTech = EAccTechNotSet; 
hgs
parents:
diff changeset
   928
            return KErrArgument; 
hgs
parents:
diff changeset
   929
		}
hgs
parents:
diff changeset
   930
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   931
    return KErrNone;  
hgs
parents:
diff changeset
   932
    }
hgs
parents:
diff changeset
   933
hgs
parents:
diff changeset
   934
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   935
// Contructs a response for the read command. 
hgs
parents:
diff changeset
   936
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   937
//
hgs
parents:
diff changeset
   938
TInt CATCOPSCmd::ConstructNetworkInfoResponse()
hgs
parents:
diff changeset
   939
    {
hgs
parents:
diff changeset
   940
    TRACE_FUNC_ENTRY
hgs
parents:
diff changeset
   941
    RBuf8 reply;
hgs
parents:
diff changeset
   942
    TInt size(KMaxNetworkTestResponseAdditionalSize + KLongOperatorNameFormatLength);       
hgs
parents:
diff changeset
   943
    TChar carriageReturn;
hgs
parents:
diff changeset
   944
    TChar lineFeed;
hgs
parents:
diff changeset
   945
    TInt err;
hgs
parents:
diff changeset
   946
    err = reply.Create(size);
hgs
parents:
diff changeset
   947
	err |= iCallback->GetCharacterValue( ECharTypeCR, carriageReturn );
hgs
parents:
diff changeset
   948
	err |= iCallback->GetCharacterValue( ECharTypeLF, lineFeed );		
hgs
parents:
diff changeset
   949
	if(err != KErrNone) 
hgs
parents:
diff changeset
   950
		{
hgs
parents:
diff changeset
   951
		return err; 
hgs
parents:
diff changeset
   952
		}
hgs
parents:
diff changeset
   953
hgs
parents:
diff changeset
   954
	// Some PC Software expects and extra CR+LF, hence those are added twice: 
hgs
parents:
diff changeset
   955
	reply.Append( carriageReturn ); 
hgs
parents:
diff changeset
   956
	reply.Append( lineFeed );
hgs
parents:
diff changeset
   957
    reply.Append( carriageReturn );
hgs
parents:
diff changeset
   958
    reply.Append( lineFeed );  
hgs
parents:
diff changeset
   959
    reply.Append(_L("+COPS: "));  
hgs
parents:
diff changeset
   960
    reply.AppendNum(iRegistrationMode);  
hgs
parents:
diff changeset
   961
    reply.Append(_L(","));  
hgs
parents:
diff changeset
   962
    switch(iFormat)
hgs
parents:
diff changeset
   963
        {
hgs
parents:
diff changeset
   964
        case RMmCustomAPI::EOperatorNameNitzFull:   
hgs
parents:
diff changeset
   965
            reply.AppendNum(EFormatLong);  
hgs
parents:
diff changeset
   966
            reply.Append(_L(",")); 
hgs
parents:
diff changeset
   967
            reply.Append(_L("\""));   
hgs
parents:
diff changeset
   968
            TRACE_INFO(( _L8("CATCOPSCmd::ConstructNetworkInfoResponse() appending (%S)"), 
hgs
parents:
diff changeset
   969
                    &iNetworkInfo.iLongName));
hgs
parents:
diff changeset
   970
            reply.Append(iNetworkInfo.iLongName);  
hgs
parents:
diff changeset
   971
            break; 
hgs
parents:
diff changeset
   972
        case RMmCustomAPI::EOperatorNameNitzShort:
hgs
parents:
diff changeset
   973
            reply.AppendNum(EFormatShort); 
hgs
parents:
diff changeset
   974
            reply.Append(_L(",")); 
hgs
parents:
diff changeset
   975
            reply.Append(_L("\"")); 
hgs
parents:
diff changeset
   976
            TRACE_INFO(( _L8("CATCOPSCmd::ConstructNetworkInfoResponse() appending (%S)"), 
hgs
parents:
diff changeset
   977
                    &iNetworkInfo.iShortName));
hgs
parents:
diff changeset
   978
            reply.Append(iNetworkInfo.iShortName); 
hgs
parents:
diff changeset
   979
            break; 
hgs
parents:
diff changeset
   980
        case RMmCustomAPI::EOperatorNameMccMnc: 
hgs
parents:
diff changeset
   981
            reply.AppendNum(EFormatNumeric); 
hgs
parents:
diff changeset
   982
            reply.Append(_L(",")); 
hgs
parents:
diff changeset
   983
            reply.Append(_L("\"")); 
hgs
parents:
diff changeset
   984
            TRACE_INFO(( _L8("CATCOPSCmd::ConstructNetworkInfoResponse() appending codes (%S) and (%S)"), 
hgs
parents:
diff changeset
   985
                            &iNetworkInfo.iCountryCode, &iNetworkInfo.iNetworkId));
hgs
parents:
diff changeset
   986
            reply.Append(iNetworkInfo.iCountryCode); 
hgs
parents:
diff changeset
   987
            reply.Append(iNetworkInfo.iNetworkId); 
hgs
parents:
diff changeset
   988
            break; 
hgs
parents:
diff changeset
   989
        }
hgs
parents:
diff changeset
   990
    reply.Append(_L("\"")); 
hgs
parents:
diff changeset
   991
hgs
parents:
diff changeset
   992
    if(SolveAccessTechnology(iNetworkInfo.iAccess) == KErrNone && iAccTech != EAccTechNotSet) 
hgs
parents:
diff changeset
   993
        {
hgs
parents:
diff changeset
   994
        TRACE_INFO((_L("CATCOPSCmd::ConstructNetworkInfoResponse() appending acc. tech. (%d)"), 
hgs
parents:
diff changeset
   995
                            iAccTech));
hgs
parents:
diff changeset
   996
        reply.Append(_L(",")); 
hgs
parents:
diff changeset
   997
        reply.AppendNum(iAccTech); 
hgs
parents:
diff changeset
   998
        }
hgs
parents:
diff changeset
   999
hgs
parents:
diff changeset
  1000
    reply.Append( carriageReturn );
hgs
parents:
diff changeset
  1001
    reply.Append( lineFeed );
hgs
parents:
diff changeset
  1002
hgs
parents:
diff changeset
  1003
    CreateReply(ETrue, reply); 
hgs
parents:
diff changeset
  1004
hgs
parents:
diff changeset
  1005
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
  1006
    return KErrNone;  
hgs
parents:
diff changeset
  1007
    }
hgs
parents:
diff changeset
  1008
hgs
parents:
diff changeset
  1009
hgs
parents:
diff changeset
  1010
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1011
// Contructs a response for the test command. 
hgs
parents:
diff changeset
  1012
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1013
//
hgs
parents:
diff changeset
  1014
void CATCOPSCmd::ConstructNetworkListResponseL()
hgs
parents:
diff changeset
  1015
    {
hgs
parents:
diff changeset
  1016
    TRACE_FUNC_ENTRY
hgs
parents:
diff changeset
  1017
    RBuf8 reply;
hgs
parents:
diff changeset
  1018
    TChar carriageReturn;
hgs
parents:
diff changeset
  1019
    TChar lineFeed;
hgs
parents:
diff changeset
  1020
hgs
parents:
diff changeset
  1021
    TInt maxItemSize(KMaxNetworkReadResponseAdditionalSize  
hgs
parents:
diff changeset
  1022
            + KShortOperatorNameFormatLength 
hgs
parents:
diff changeset
  1023
            + KLongOperatorNameFormatLength 
hgs
parents:
diff changeset
  1024
            + KNumericOperatorNameFormatLength
hgs
parents:
diff changeset
  1025
            + KSupportedModesStr().Length()
hgs
parents:
diff changeset
  1026
            + KSupportedFormatsStr().Length()); 
hgs
parents:
diff changeset
  1027
hgs
parents:
diff changeset
  1028
    CleanupClosePushL(reply); 
hgs
parents:
diff changeset
  1029
hgs
parents:
diff changeset
  1030
    User::LeaveIfNull(iDetectedNetworks); 
hgs
parents:
diff changeset
  1031
    User::LeaveIfError(reply.Create( maxItemSize * iDetectedNetworks->Enumerate())); 
hgs
parents:
diff changeset
  1032
    User::LeaveIfError(iCallback->GetCharacterValue( ECharTypeCR, carriageReturn ));
hgs
parents:
diff changeset
  1033
    User::LeaveIfError(iCallback->GetCharacterValue( ECharTypeLF, lineFeed ));		
hgs
parents:
diff changeset
  1034
hgs
parents:
diff changeset
  1035
    // Some PC Software expects and extra CR+LF, hence those are added twice: 
hgs
parents:
diff changeset
  1036
    reply.Append( carriageReturn );
hgs
parents:
diff changeset
  1037
    reply.Append( lineFeed );
hgs
parents:
diff changeset
  1038
    reply.Append( carriageReturn );
hgs
parents:
diff changeset
  1039
    reply.Append( lineFeed );
hgs
parents:
diff changeset
  1040
    reply.Append( _L("+COPS: ") ); 
hgs
parents:
diff changeset
  1041
hgs
parents:
diff changeset
  1042
    RMobilePhone::TMobilePhoneNetworkInfoV2 nwInfo; 
hgs
parents:
diff changeset
  1043
    for(TInt i = 0; i < iDetectedNetworks->Enumerate(); ++i)
hgs
parents:
diff changeset
  1044
        {
hgs
parents:
diff changeset
  1045
		if(i > 0) // Add CR+LF after the first cycle. 
hgs
parents:
diff changeset
  1046
			{
hgs
parents:
diff changeset
  1047
            reply.Append( carriageReturn );
hgs
parents:
diff changeset
  1048
            reply.Append( lineFeed );
hgs
parents:
diff changeset
  1049
			}
hgs
parents:
diff changeset
  1050
        nwInfo = iDetectedNetworks->GetEntryL(i);  
hgs
parents:
diff changeset
  1051
hgs
parents:
diff changeset
  1052
        reply.Append(_L("(")); 
hgs
parents:
diff changeset
  1053
        reply.AppendNum(nwInfo.iStatus); 
hgs
parents:
diff changeset
  1054
        reply.Append(_L(",")); 
hgs
parents:
diff changeset
  1055
		reply.Append(_L("\"")); 
hgs
parents:
diff changeset
  1056
        reply.Append(nwInfo.iLongName); 
hgs
parents:
diff changeset
  1057
		reply.Append(_L("\"")); 
hgs
parents:
diff changeset
  1058
        reply.Append(_L(",")); 
hgs
parents:
diff changeset
  1059
		reply.Append(_L("\"")); 
hgs
parents:
diff changeset
  1060
        reply.Append(nwInfo.iShortName); 
hgs
parents:
diff changeset
  1061
		reply.Append(_L("\"")); 
hgs
parents:
diff changeset
  1062
        reply.Append(_L(",")); 
hgs
parents:
diff changeset
  1063
		reply.Append(_L("\"")); 
hgs
parents:
diff changeset
  1064
        reply.Append(nwInfo.iCountryCode); 
hgs
parents:
diff changeset
  1065
        reply.Append(nwInfo.iNetworkId); 
hgs
parents:
diff changeset
  1066
		reply.Append(_L("\"")); 
hgs
parents:
diff changeset
  1067
        if(SolveAccessTechnology(nwInfo.iAccess) == KErrNone && iAccTech != EAccTechNotSet) 
hgs
parents:
diff changeset
  1068
            {
hgs
parents:
diff changeset
  1069
            TRACE_INFO((_L("CATCOPSCmd::ConstructNetworkListResponse() appending acc. tech. (%d)"), iAccTech));
hgs
parents:
diff changeset
  1070
            reply.Append(_L(",")); 
hgs
parents:
diff changeset
  1071
            reply.AppendNum(iAccTech); 
hgs
parents:
diff changeset
  1072
            }
hgs
parents:
diff changeset
  1073
        reply.Append(_L(")")); 
hgs
parents:
diff changeset
  1074
        reply.Append(_L(",")); 
hgs
parents:
diff changeset
  1075
		TRACE_INFO( _L("CATCOPSCmd::ConstructNetworkListResponse() -- entry added to reply."));
hgs
parents:
diff changeset
  1076
        }
hgs
parents:
diff changeset
  1077
    reply.Append(KSupportedModesStr); // Supported modes as defined in 3GPP TS 27.007 V8.4.1
hgs
parents:
diff changeset
  1078
    reply.Append(KSupportedFormatsStr);  // Supported formats as defined in 3GPP TS 27.007 V8.4.1
hgs
parents:
diff changeset
  1079
hgs
parents:
diff changeset
  1080
    reply.Append( carriageReturn );
hgs
parents:
diff changeset
  1081
    reply.Append( lineFeed );
hgs
parents:
diff changeset
  1082
hgs
parents:
diff changeset
  1083
		// Finally append the "OK". CreateOkOrErrorReply returns verbose or numeric version. 
hgs
parents:
diff changeset
  1084
    RBuf8 okReply;
hgs
parents:
diff changeset
  1085
    CleanupClosePushL(okReply); 
hgs
parents:
diff changeset
  1086
    iCallback->CreateOkOrErrorReply( okReply, ETrue );
hgs
parents:
diff changeset
  1087
    reply.Append( okReply);
hgs
parents:
diff changeset
  1088
    CreateReply(ETrue, reply); 
hgs
parents:
diff changeset
  1089
    CleanupStack::PopAndDestroy(&okReply);   
hgs
parents:
diff changeset
  1090
    CleanupStack::PopAndDestroy(&reply);   
hgs
parents:
diff changeset
  1091
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
  1092
    }
hgs
parents:
diff changeset
  1093
hgs
parents:
diff changeset
  1094
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1095
// Finalises the response and sends it. 
hgs
parents:
diff changeset
  1096
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1097
//
hgs
parents:
diff changeset
  1098
void CATCOPSCmd::CreateReply(TBool aIsOK, const TDesC8 &aReply) 
hgs
parents:
diff changeset
  1099
    {
hgs
parents:
diff changeset
  1100
    if(aIsOK == EFalse)
hgs
parents:
diff changeset
  1101
        {
hgs
parents:
diff changeset
  1102
        iCallback->CreateReplyAndComplete( EReplyTypeError);
hgs
parents:
diff changeset
  1103
        }
hgs
parents:
diff changeset
  1104
    else 
hgs
parents:
diff changeset
  1105
        {
hgs
parents:
diff changeset
  1106
        if(aReply.Length() > 0)
hgs
parents:
diff changeset
  1107
            {
hgs
parents:
diff changeset
  1108
            iCallback->CreateReplyAndComplete( EReplyTypeOther,
hgs
parents:
diff changeset
  1109
                                           aReply );
hgs
parents:
diff changeset
  1110
            }
hgs
parents:
diff changeset
  1111
        else 
hgs
parents:
diff changeset
  1112
            {
hgs
parents:
diff changeset
  1113
            iCallback->CreateReplyAndComplete( EReplyTypeOk);
hgs
parents:
diff changeset
  1114
            }
hgs
parents:
diff changeset
  1115
        }
hgs
parents:
diff changeset
  1116
    iCurrentOperation = EIdle; 
hgs
parents:
diff changeset
  1117
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
  1118
    }