cbsatplugin/atmisccmdplugin/src/scpbrcommandhandler.cpp
author hgs
Fri, 23 Jul 2010 15:57:13 +0300
changeset 47 9e2a905b887f
child 64 1934667b0e2b
permissions -rw-r--r--
201029_02
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
47
9e2a905b887f 201029_02
hgs
parents:
diff changeset
     1
/*
9e2a905b887f 201029_02
hgs
parents:
diff changeset
     2
 * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
9e2a905b887f 201029_02
hgs
parents:
diff changeset
     3
 * All rights reserved.
9e2a905b887f 201029_02
hgs
parents:
diff changeset
     4
 * This component and the accompanying materials are made available
9e2a905b887f 201029_02
hgs
parents:
diff changeset
     5
 * under the terms of "Eclipse Public License v1.0"
9e2a905b887f 201029_02
hgs
parents:
diff changeset
     6
 * which accompanies this distribution, and is available
9e2a905b887f 201029_02
hgs
parents:
diff changeset
     7
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
9e2a905b887f 201029_02
hgs
parents:
diff changeset
     8
 * Initial Contributors:
9e2a905b887f 201029_02
hgs
parents:
diff changeset
     9
 * Nokia Corporation - initial contribution.
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    10
 *
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    11
 * Contributors:
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    12
 * Description :
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    13
 *
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    14
 */
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    15
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    16
#include "scpbrcommandhandler.h"
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    17
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    18
#include <mpbutil.h>
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    19
#include "debug.h"
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    20
#include "atmisccmdpluginconsts.h"
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    21
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    22
CSCPBRCommandHandler::CSCPBRCommandHandler( 
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    23
		MATMiscCmdPlugin* aCallback, 
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    24
		TAtCommandParser& aATCmdParser, 
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    25
		RMobilePhone& aPhone) 
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    26
		: CATCmdAsyncBase( aCallback, aATCmdParser, aPhone )
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    27
	{
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    28
    TRACE_FUNC_ENTRY
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    29
    TRACE_FUNC_EXIT
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    30
	}
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    31
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    32
CSCPBRCommandHandler::~CSCPBRCommandHandler()
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    33
	{
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    34
    TRACE_FUNC_ENTRY
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    35
    Cancel();
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    36
    iPhoneBookStore.Close();
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    37
    iCustomApi.Close();
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    38
    iReply.Close();
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    39
    delete iPhoneBookBuffer;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    40
    iEntries.Close();
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    41
    iContactsBuf.Close();
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    42
    TRACE_FUNC_EXIT
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    43
	}
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    44
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    45
void CSCPBRCommandHandler::ConstructL()
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    46
	{
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    47
    TRACE_FUNC_ENTRY
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    48
    TInt err = iPhoneBookStore.Open( iPhone, KETelIccAdnPhoneBook);
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    49
    if( err != KErrNone )  // if the phonebookstore can't be opened or error occurs when try to open it.
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    50
        {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    51
        iState = ESCPBRStateNotSupported;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    52
        TRACE_FUNC_EXIT
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    53
        return;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    54
        }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    55
    err = iCustomApi.Open( iPhone );
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    56
    if( err != KErrNone )  // If the custom api can't be opened.
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    57
        {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    58
        iPhoneBookStore.Close();
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    59
        iState = ESCPBRStateNotSupported;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    60
        TRACE_FUNC_EXIT
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    61
        return;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    62
        }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    63
    iReply.CreateL( KBufBlockSize );
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    64
	iPhoneBookBuffer = new ( ELeave ) CPhoneBookBuffer();	
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    65
    TRACE_FUNC_EXIT
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    66
	}
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    67
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    68
CSCPBRCommandHandler* CSCPBRCommandHandler::NewL( 
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    69
		MATMiscCmdPlugin* aCallback, 
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    70
		TAtCommandParser& aATCmdParser, 
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    71
		RMobilePhone& aPhone )
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    72
	{
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    73
    TRACE_FUNC_ENTRY
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    74
	CSCPBRCommandHandler * self = new ( ELeave ) CSCPBRCommandHandler( aCallback, aATCmdParser, aPhone );
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    75
	CleanupStack::PushL( self );
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    76
	self->ConstructL();
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    77
	CleanupStack::Pop( self );
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    78
    TRACE_FUNC_EXIT
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    79
	return self;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    80
	}
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    81
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    82
void CSCPBRCommandHandler::HandleCommand(const TDesC8& /*aCmd*/, RBuf8& /*aReply*/, TBool /*aReplyNeeded*/ )
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    83
	{
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    84
    TRACE_FUNC_ENTRY
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    85
    if( iState == ESCPBRStateIdle )  // Not supported or have unfinished task.
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    86
        {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    87
        iReply.Zero();  
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    88
        TAtCommandParser::TCommandHandlerType cmdHandlerType = iATCmdParser.CommandHandlerType();
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    89
        switch( cmdHandlerType )
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    90
            {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    91
            case TAtCommandParser::ECmdHandlerTypeTest: // command: AT^SCPBR=?
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    92
                {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    93
                if( iTotalEntries == 0 )
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    94
                    {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    95
                    iState = ESCPBRStateGetPhoneBookInfo;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    96
                    RMobilePhoneBookStore::TMobilePhoneBookInfoV1Pckg pkg( iPhoneBookInfo );
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    97
                    iPhoneBookStore.GetInfo( iStatus, pkg );
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    98
                    SetActive();
9e2a905b887f 201029_02
hgs
parents:
diff changeset
    99
                    }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   100
                else if ( iMLength ==0 )
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   101
                    {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   102
                    iState = ESCPBRStateGet3GPBInfo;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   103
                    iCustomApi.Get3GPBInfo( iStatus, i3GPBInfo );
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   104
                    SetActive();
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   105
                    }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   106
                else
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   107
                    {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   108
                    iReply.Format( KSCPBRSupportedEntriesIndexList, 
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   109
                            iTotalEntries, iNLength, iTLength, iMLength );
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   110
                    iCallback->CreateReplyAndComplete( EReplyTypeOk, iReply );
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   111
                    }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   112
                break;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   113
                }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   114
            case TAtCommandParser::ECmdHandlerTypeSet:  // command: AT^SCPBR=<index1>[,<index2>]
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   115
                {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   116
                if( ParseParameters() == KErrNone )
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   117
                    {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   118
                    iEntries.Reset();
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   119
                    TInt amountOfEntries = iIndex2 - iIndex1 + 1;  // the amount of entries.
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   120
                    Trace( _L8("The amount of entries: %d "), amountOfEntries );
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   121
                    iContactsBuf.Zero();
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   122
                    TInt bufSize;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   123
                    if( amountOfEntries >= KSCPBRMaxEntryCount )
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   124
                        {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   125
                        bufSize= KSCPBRMaxEntryCount * KSCPBRDefaultSizeOfOneEntry;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   126
                        amountOfEntries = KSCPBRMaxEntryCount;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   127
                        }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   128
                    else
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   129
                        {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   130
                        bufSize = amountOfEntries * KSCPBRDefaultSizeOfOneEntry;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   131
                        }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   132
                    
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   133
                    if( bufSize >= iContactsBuf.MaxLength() )
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   134
                        {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   135
                        TInt err = iContactsBuf.ReAlloc( bufSize );
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   136
                        Trace( _L8("The error code of the realloc: %d "), err );
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   137
                        if( err != KErrNone )
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   138
                            {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   139
                            iState = ESCPBRStateIdle;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   140
                            iCallback->CreateReplyAndComplete( EReplyTypeError );
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   141
                            break;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   142
                            }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   143
                        }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   144
                    iState = ESCPBRStateRead;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   145
                    iPhoneBookStore.Read( iStatus,  iIndex1, amountOfEntries, iContactsBuf );
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   146
                    SetActive();
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   147
                    }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   148
                else
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   149
                    {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   150
                    iCallback->CreateReplyAndComplete( EReplyTypeError );
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   151
                    }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   152
                break;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   153
                }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   154
            default:
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   155
                {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   156
                iCallback->CreateReplyAndComplete( EReplyTypeError );
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   157
                break;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   158
                }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   159
            }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   160
        }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   161
    else
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   162
        {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   163
        iCallback->CreateReplyAndComplete( EReplyTypeError );
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   164
        } 
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   165
       TRACE_FUNC_EXIT
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   166
	}
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   167
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   168
TInt CSCPBRCommandHandler::ParseParameters()
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   169
    {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   170
    TRACE_FUNC_ENTRY
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   171
    iIndex1 = 0; 
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   172
    iIndex2 = 0;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   173
    TInt index3;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   174
    TInt ret1 = iATCmdParser.NextIntParam( iIndex1 );
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   175
    TInt ret2 = iATCmdParser.NextIntParam( iIndex2 );
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   176
    TInt ret3 = iATCmdParser.NextIntParam( index3 );
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   177
    
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   178
    if( ret1 != KErrNone 
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   179
            || ( ret2 != KErrNone && ret2 != KErrNotFound )
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   180
            || ret3 != KErrNotFound )
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   181
        {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   182
        TRACE_FUNC_EXIT
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   183
        return KErrArgument;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   184
        }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   185
    if( ret2 == KErrNotFound )
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   186
        {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   187
        iIndex2 = iIndex1;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   188
        }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   189
    if (iIndex2 < iIndex1)
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   190
        {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   191
        TRACE_FUNC_EXIT
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   192
        return KErrArgument;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   193
        }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   194
    TRACE_FUNC_EXIT
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   195
    return KErrNone;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   196
    }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   197
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   198
void CSCPBRCommandHandler::RunL()
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   199
	{
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   200
    TRACE_FUNC_ENTRY
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   201
    iReply.Zero();
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   202
    TInt result = iStatus.Int();
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   203
    if( result == KErrNone )
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   204
        {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   205
        switch( iState )
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   206
            {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   207
            case ESCPBRStateRead:
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   208
                {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   209
                ExtractEntriesL();
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   210
                FormatReplyL();
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   211
                iState = ESCPBRStateIdle;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   212
                iCallback->CreateReplyAndComplete(EReplyTypeOk, iReply);
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   213
                break;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   214
                }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   215
            case ESCPBRStateGetPhoneBookInfo:
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   216
                {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   217
                iTotalEntries = iPhoneBookInfo.iTotalEntries;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   218
                iNLength = iPhoneBookInfo.iMaxNumLength;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   219
                iTLength = iPhoneBookInfo.iMaxTextLength;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   220
                if (iMLength == 0)
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   221
                    {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   222
                    iState = ESCPBRStateGet3GPBInfo;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   223
                    iCustomApi.Get3GPBInfo( iStatus, i3GPBInfo );
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   224
                    SetActive();
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   225
                    }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   226
                else 
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   227
                    {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   228
                    iReply.Format( KSCPBRSupportedEntriesIndexList, 
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   229
                            iTotalEntries, iNLength, iTLength, iMLength );
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   230
                    iState = ESCPBRStateIdle;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   231
                    iCallback->CreateReplyAndComplete( EReplyTypeOk, iReply );
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   232
                    }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   233
                break;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   234
                }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   235
            case ESCPBRStateGet3GPBInfo:
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   236
                {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   237
                iMLength = i3GPBInfo.iMaxLenEmail;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   238
                iReply.Format( KSCPBRSupportedEntriesIndexList, 
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   239
                        iTotalEntries, iNLength, iTLength, iMLength );
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   240
                iState = ESCPBRStateIdle;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   241
                iCallback->CreateReplyAndComplete( EReplyTypeOk, iReply );
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   242
                break;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   243
                }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   244
            default: 
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   245
                {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   246
                iState = ESCPBRStateIdle;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   247
                iCallback->CreateReplyAndComplete( EReplyTypeError );
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   248
                break;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   249
                }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   250
            }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   251
        }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   252
    else
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   253
        {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   254
        iState = ESCPBRStateIdle;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   255
        iCallback->CreateCMEReplyAndComplete( result );
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   256
        }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   257
    TRACE_FUNC_EXIT
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   258
	}
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   259
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   260
TInt CSCPBRCommandHandler::RunError(TInt aError)
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   261
    {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   262
    TRACE_FUNC_ENTRY
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   263
    iState = ESCPBRStateIdle;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   264
    iCallback->CreateReplyAndComplete( EReplyTypeError );
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   265
    TRACE_FUNC_EXIT
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   266
    return KErrNone;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   267
    }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   268
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   269
void CSCPBRCommandHandler::ExtractEntriesL()
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   270
    {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   271
    TRACE_FUNC_ENTRY
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   272
    iPhoneBookBuffer->Set( &iContactsBuf );
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   273
    iPhoneBookBuffer->StartRead();
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   274
    TUint8 fieldTag;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   275
    CPhoneBookBuffer::TPhBkTagType dataType;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   276
    TInt numCount = 0;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   277
	// clear entry arry for use.
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   278
    iEntries.Reset();
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   279
    User::LeaveIfError(iPhoneBookBuffer->GetTagAndType( fieldTag, dataType ));
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   280
    if( fieldTag != RMobilePhoneBookStore::ETagPBNewEntry )
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   281
        {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   282
        // Buffer corrupt
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   283
        User::Leave(KErrCorrupt);
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   284
        }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   285
    TInt ret = KErrNone;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   286
    TInt index = -1; // at least one entry
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   287
    while (ret != KErrNotFound) // if reach the buffer end.
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   288
        {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   289
        switch (fieldTag)
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   290
            {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   291
            case RMobilePhoneBookStore::ETagPBNewEntry:
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   292
                {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   293
                TPhoneBookEntry entry;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   294
                iEntries.AppendL(entry);
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   295
                ++index;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   296
                numCount = 0; // set the number count of new entry to 0. 
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   297
                break;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   298
                }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   299
            case RMobilePhoneBookStore::ETagPBAdnIndex:
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   300
                {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   301
                TUint16 simIndex = 0;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   302
                if (dataType != CPhoneBookBuffer::EPhBkTypeInt16)
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   303
                    {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   304
                    User::Leave(KErrCorrupt);
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   305
                    }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   306
                User::LeaveIfError( iPhoneBookBuffer->GetValue(simIndex) );
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   307
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   308
                iEntries[index].iIndex = simIndex;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   309
                break;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   310
                }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   311
            case RMobilePhoneBookStore::ETagPBText:
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   312
                {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   313
                TPtrC16 text;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   314
                if (dataType != CPhoneBookBuffer::EPhBkTypeDes16)
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   315
                    {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   316
                    User::Leave(KErrCorrupt);
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   317
                    }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   318
                User::LeaveIfError( iPhoneBookBuffer->GetValue(text) );
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   319
                CopyToPhonebookEntryField(iEntries[index].iName, text);
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   320
                break;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   321
                }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   322
            case RMobilePhoneBookStore::ETagPBNumber:
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   323
                {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   324
                TPtrC16 number;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   325
                if (dataType != CPhoneBookBuffer::EPhBkTypeDes16)
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   326
                    {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   327
                    User::Leave(KErrCorrupt);
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   328
                    }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   329
                User::LeaveIfError( iPhoneBookBuffer->GetValue(number) );
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   330
                ++numCount;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   331
                switch (numCount)
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   332
                    {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   333
                    case 1: // The first number
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   334
                        CopyToPhonebookEntryField(iEntries[index].iNumber1, number);
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   335
                        break;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   336
                    case 2: // The Second number
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   337
                        CopyToPhonebookEntryField(iEntries[index].iNumber2, number);
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   338
                        break;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   339
                    case 3: // the Third number
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   340
                        CopyToPhonebookEntryField(iEntries[index].iNumber3, number);
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   341
                        break;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   342
                    case 4: // the fourth number.
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   343
                        CopyToPhonebookEntryField(iEntries[index].iNumber4, number);
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   344
                        break;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   345
                    }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   346
                break;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   347
                }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   348
            case RMobilePhoneBookStore::ETagPBEmailAddress:
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   349
                {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   350
                TPtrC16 email;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   351
                if (dataType != CPhoneBookBuffer::EPhBkTypeDes16)
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   352
                    {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   353
                    User::Leave(KErrCorrupt);
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   354
                    }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   355
                User::LeaveIfError( iPhoneBookBuffer->GetValue(email) );
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   356
                CopyToPhonebookEntryField(iEntries[index].iEmail, email);
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   357
                break;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   358
                }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   359
            default:
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   360
                {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   361
                iPhoneBookBuffer->SkipValue(dataType);
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   362
                break;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   363
                }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   364
            }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   365
        ret = iPhoneBookBuffer->GetTagAndType(fieldTag, dataType);
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   366
        }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   367
 
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   368
    TRACE_FUNC_EXIT
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   369
    }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   370
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   371
void CSCPBRCommandHandler::CopyToPhonebookEntryField(TDes8& aDest, const TDesC16& aSrc)
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   372
    {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   373
    TRACE_FUNC_ENTRY
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   374
    TInt maxLength = aDest.MaxLength();
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   375
    if ( aSrc.Length() <= maxLength )
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   376
        {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   377
        aDest.Copy(aSrc);
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   378
        }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   379
    else
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   380
        {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   381
        aDest.Copy( aSrc.Left(maxLength) );
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   382
        }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   383
    TRACE_FUNC_EXIT    
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   384
    }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   385
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   386
void CSCPBRCommandHandler::FormatReplyL()
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   387
    {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   388
    TRACE_FUNC_ENTRY
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   389
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   390
    TInt count = iEntries.Count();
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   391
    for (TInt i = 0; i < count; ++i)
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   392
        {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   393
        AppendEntryL(iEntries[i]);
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   394
        }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   395
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   396
    TRACE_FUNC_EXIT
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   397
    }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   398
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   399
void CSCPBRCommandHandler::AppendEntryL(const TPhoneBookEntry& aEntry)
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   400
    {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   401
    TRACE_FUNC_ENTRY
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   402
    TBuf8<KSCPBRDefaultSizeOfOneEntry> entryBuffer;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   403
    aEntry.Externalize(entryBuffer);
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   404
    
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   405
    TInt length = entryBuffer.Length() + KSCPBR().Length(); 
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   406
    if (length + iReply.Length() > iReply.MaxLength())
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   407
        {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   408
        iReply.ReAllocL(iReply.MaxLength()+KBufBlockSize);
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   409
        }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   410
    
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   411
    iReply.Append(KSCPBR);
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   412
    iReply.Append(entryBuffer);
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   413
    TRACE_FUNC_EXIT
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   414
    }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   415
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   416
void CSCPBRCommandHandler::DoCancel()
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   417
	{
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   418
    TRACE_FUNC_ENTRY
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   419
    switch( iState )
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   420
        {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   421
        case ESCPBRStateRead:
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   422
            {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   423
            iPhoneBookStore.CancelAsyncRequest( EMobilePhoneStoreRead );
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   424
            break;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   425
            }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   426
        case ESCPBRStateGetPhoneBookInfo:
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   427
            {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   428
            iPhoneBookStore.CancelAsyncRequest( EMobilePhoneStoreGetInfo );
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   429
            break;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   430
            }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   431
        case ESCPBRStateGet3GPBInfo:
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   432
            {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   433
            iPhoneBookStore.CancelAsyncRequest( EGet3GPBInfoIPC );
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   434
            break;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   435
            }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   436
        default:
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   437
            break;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   438
        }
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   439
    iState = ESCPBRStateIdle;
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   440
    TRACE_FUNC_EXIT
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   441
	}
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   442
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   443
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   444
void CSCPBRCommandHandler::TPhoneBookEntry::Externalize(TDes8& aDes) const
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   445
    {
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   446
    TRACE_FUNC_ENTRY
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   447
    
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   448
    aDes.Format(KSCPBRReplyOneEntry, iIndex, &iNumber1, &iNumber2, &iNumber3, &iNumber4, &iName, &iEmail);
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   449
    
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   450
    TRACE_FUNC_EXIT
9e2a905b887f 201029_02
hgs
parents:
diff changeset
   451
    }