diff -r 1934667b0e2b -r 4b59561a31c0 cbsatplugin/atmisccmdplugin/src/scpbrcommandhandler.cpp --- a/cbsatplugin/atmisccmdplugin/src/scpbrcommandhandler.cpp Wed Sep 15 12:23:51 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,452 +0,0 @@ -/* - * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). - * All rights reserved. - * This component and the accompanying materials are made available - * under the terms of "Eclipse Public License v1.0" - * which accompanies this distribution, and is available - * at the URL "http://www.eclipse.org/legal/epl-v10.html". - * Initial Contributors: - * Nokia Corporation - initial contribution. - * - * Contributors: - * Description : - * - */ - -#include "scpbrcommandhandler.h" - -#include -#include "debug.h" -#include "atmisccmdpluginconsts.h" - -CSCPBRCommandHandler::CSCPBRCommandHandler( - MATMiscCmdPlugin* aCallback, - TAtCommandParser& aATCmdParser, - RMobilePhone& aPhone) - : CATCmdAsyncBase( aCallback, aATCmdParser, aPhone ) - { - TRACE_FUNC_ENTRY - TRACE_FUNC_EXIT - } - -CSCPBRCommandHandler::~CSCPBRCommandHandler() - { - TRACE_FUNC_ENTRY - Cancel(); - iPhoneBookStore.Close(); - iCustomApi.Close(); - iReply.Close(); - delete iPhoneBookBuffer; - iEntries.Close(); - iContactsBuf.Close(); - TRACE_FUNC_EXIT - } - -void CSCPBRCommandHandler::ConstructL() - { - TRACE_FUNC_ENTRY - TInt err = iPhoneBookStore.Open( iPhone, KETelIccAdnPhoneBook); - if( err != KErrNone ) // if the phonebookstore can't be opened or error occurs when try to open it. - { - iState = ESCPBRStateNotSupported; - TRACE_FUNC_EXIT - return; - } - err = iCustomApi.Open( iPhone ); - if( err != KErrNone ) // If the custom api can't be opened. - { - iPhoneBookStore.Close(); - iState = ESCPBRStateNotSupported; - TRACE_FUNC_EXIT - return; - } - iReply.CreateL( KBufBlockSize ); - iPhoneBookBuffer = new ( ELeave ) CPhoneBookBuffer(); - TRACE_FUNC_EXIT - } - -CSCPBRCommandHandler* CSCPBRCommandHandler::NewL( - MATMiscCmdPlugin* aCallback, - TAtCommandParser& aATCmdParser, - RMobilePhone& aPhone ) - { - TRACE_FUNC_ENTRY - CSCPBRCommandHandler * self = new ( ELeave ) CSCPBRCommandHandler( aCallback, aATCmdParser, aPhone ); - CleanupStack::PushL( self ); - self->ConstructL(); - CleanupStack::Pop( self ); - TRACE_FUNC_EXIT - return self; - } - -void CSCPBRCommandHandler::HandleCommand(const TDesC8& /*aCmd*/, RBuf8& /*aReply*/, TBool /*aReplyNeeded*/ ) - { - TRACE_FUNC_ENTRY - if( iState == ESCPBRStateIdle ) // Not supported or have unfinished task. - { - iReply.Zero(); - TAtCommandParser::TCommandHandlerType cmdHandlerType = iATCmdParser.CommandHandlerType(); - switch( cmdHandlerType ) - { - case TAtCommandParser::ECmdHandlerTypeTest: // command: AT^SCPBR=? - { - if( iTotalEntries == 0 ) - { - iState = ESCPBRStateGetPhoneBookInfo; - RMobilePhoneBookStore::TMobilePhoneBookInfoV1Pckg pkg( iPhoneBookInfo ); - iPhoneBookStore.GetInfo( iStatus, pkg ); - SetActive(); - } - else if ( iMLength ==0 ) - { - iState = ESCPBRStateGet3GPBInfo; - iCustomApi.Get3GPBInfo( iStatus, i3GPBInfo ); - SetActive(); - } - else - { - iReply.Format( KSCPBRSupportedEntriesIndexList, - iTotalEntries, iNLength, iTLength, iMLength ); - iCallback->CreateReplyAndComplete( EReplyTypeOk, iReply ); - } - break; - } - case TAtCommandParser::ECmdHandlerTypeSet: // command: AT^SCPBR=[,] - { - if( ParseParameters() == KErrNone ) - { - iEntries.Reset(); - TInt amountOfEntries = iIndex2 - iIndex1 + 1; // the amount of entries. - Trace( _L8("The amount of entries: %d "), amountOfEntries ); - iContactsBuf.Zero(); - TInt bufSize; - if( amountOfEntries >= KSCPBRMaxEntryCount ) - { - bufSize= KSCPBRMaxEntryCount * KSCPBRDefaultSizeOfOneEntry; - amountOfEntries = KSCPBRMaxEntryCount; - } - else - { - bufSize = amountOfEntries * KSCPBRDefaultSizeOfOneEntry; - } - - if( bufSize >= iContactsBuf.MaxLength() ) - { - TInt err = iContactsBuf.ReAlloc( bufSize ); - Trace( _L8("The error code of the realloc: %d "), err ); - if( err != KErrNone ) - { - iState = ESCPBRStateIdle; - iCallback->CreateReplyAndComplete( EReplyTypeError ); - break; - } - } - iState = ESCPBRStateRead; - iPhoneBookStore.Read( iStatus, iIndex1, amountOfEntries, iContactsBuf ); - SetActive(); - } - else - { - iCallback->CreateReplyAndComplete( EReplyTypeError ); - } - break; - } - default: - { - iCallback->CreateReplyAndComplete( EReplyTypeError ); - break; - } - } - } - else - { - iCallback->CreateReplyAndComplete( EReplyTypeError ); - } - TRACE_FUNC_EXIT - } - -TInt CSCPBRCommandHandler::ParseParameters() - { - TRACE_FUNC_ENTRY - iIndex1 = 0; - iIndex2 = 0; - TInt index3; - TInt ret1 = iATCmdParser.NextIntParam( iIndex1 ); - TInt ret2 = iATCmdParser.NextIntParam( iIndex2 ); - TInt ret3 = iATCmdParser.NextIntParam( index3 ); - - if( ret1 != KErrNone - || ( ret2 != KErrNone && ret2 != KErrNotFound ) - || ret3 != KErrNotFound ) - { - TRACE_FUNC_EXIT - return KErrArgument; - } - if( ret2 == KErrNotFound ) - { - iIndex2 = iIndex1; - } - if (iIndex2 < iIndex1) - { - TRACE_FUNC_EXIT - return KErrArgument; - } - TRACE_FUNC_EXIT - return KErrNone; - } - -void CSCPBRCommandHandler::RunL() - { - TRACE_FUNC_ENTRY - iReply.Zero(); - TInt result = iStatus.Int(); - if( result == KErrNone ) - { - switch( iState ) - { - case ESCPBRStateRead: - { - ExtractEntriesL(); - FormatReplyL(); - iState = ESCPBRStateIdle; - iCallback->CreateReplyAndComplete(EReplyTypeOk, iReply); - break; - } - case ESCPBRStateGetPhoneBookInfo: - { - iTotalEntries = iPhoneBookInfo.iTotalEntries; - iNLength = iPhoneBookInfo.iMaxNumLength; - iTLength = iPhoneBookInfo.iMaxTextLength; - if (iMLength == 0) - { - iState = ESCPBRStateGet3GPBInfo; - iCustomApi.Get3GPBInfo( iStatus, i3GPBInfo ); - SetActive(); - } - else - { - iReply.Format( KSCPBRSupportedEntriesIndexList, - iTotalEntries, iNLength, iTLength, iMLength ); - iState = ESCPBRStateIdle; - iCallback->CreateReplyAndComplete( EReplyTypeOk, iReply ); - } - break; - } - case ESCPBRStateGet3GPBInfo: - { - iMLength = i3GPBInfo.iMaxLenEmail; - iReply.Format( KSCPBRSupportedEntriesIndexList, - iTotalEntries, iNLength, iTLength, iMLength ); - iState = ESCPBRStateIdle; - iCallback->CreateReplyAndComplete( EReplyTypeOk, iReply ); - break; - } - default: - { - iState = ESCPBRStateIdle; - iCallback->CreateReplyAndComplete( EReplyTypeError ); - break; - } - } - } - else - { - iState = ESCPBRStateIdle; - iCallback->CreateCMEReplyAndComplete( result ); - } - TRACE_FUNC_EXIT - } - -TInt CSCPBRCommandHandler::RunError(TInt aError) - { - TRACE_FUNC_ENTRY - iState = ESCPBRStateIdle; - iCallback->CreateReplyAndComplete( EReplyTypeError ); - TRACE_FUNC_EXIT - return KErrNone; - } - -void CSCPBRCommandHandler::ExtractEntriesL() - { - TRACE_FUNC_ENTRY - iPhoneBookBuffer->Set( &iContactsBuf ); - iPhoneBookBuffer->StartRead(); - TUint8 fieldTag; - CPhoneBookBuffer::TPhBkTagType dataType; - TInt numCount = 0; - // clear entry arry for use. - iEntries.Reset(); - User::LeaveIfError(iPhoneBookBuffer->GetTagAndType( fieldTag, dataType )); - if( fieldTag != RMobilePhoneBookStore::ETagPBNewEntry ) - { - // Buffer corrupt - User::Leave(KErrCorrupt); - } - TInt ret = KErrNone; - TInt index = -1; // at least one entry - while (ret != KErrNotFound) // if reach the buffer end. - { - switch (fieldTag) - { - case RMobilePhoneBookStore::ETagPBNewEntry: - { - TPhoneBookEntry entry; - iEntries.AppendL(entry); - ++index; - numCount = 0; // set the number count of new entry to 0. - break; - } - case RMobilePhoneBookStore::ETagPBAdnIndex: - { - TUint16 simIndex = 0; - if (dataType != CPhoneBookBuffer::EPhBkTypeInt16) - { - User::Leave(KErrCorrupt); - } - User::LeaveIfError( iPhoneBookBuffer->GetValue(simIndex) ); - - iEntries[index].iIndex = simIndex; - break; - } - case RMobilePhoneBookStore::ETagPBText: - { - TPtrC16 text; - if (dataType != CPhoneBookBuffer::EPhBkTypeDes16) - { - User::Leave(KErrCorrupt); - } - User::LeaveIfError( iPhoneBookBuffer->GetValue(text) ); - CopyToPhonebookEntryField(iEntries[index].iName, text); - break; - } - case RMobilePhoneBookStore::ETagPBNumber: - { - TPtrC16 number; - if (dataType != CPhoneBookBuffer::EPhBkTypeDes16) - { - User::Leave(KErrCorrupt); - } - User::LeaveIfError( iPhoneBookBuffer->GetValue(number) ); - ++numCount; - switch (numCount) - { - case 1: // The first number - CopyToPhonebookEntryField(iEntries[index].iNumber1, number); - break; - case 2: // The Second number - CopyToPhonebookEntryField(iEntries[index].iNumber2, number); - break; - case 3: // the Third number - CopyToPhonebookEntryField(iEntries[index].iNumber3, number); - break; - case 4: // the fourth number. - CopyToPhonebookEntryField(iEntries[index].iNumber4, number); - break; - } - break; - } - case RMobilePhoneBookStore::ETagPBEmailAddress: - { - TPtrC16 email; - if (dataType != CPhoneBookBuffer::EPhBkTypeDes16) - { - User::Leave(KErrCorrupt); - } - User::LeaveIfError( iPhoneBookBuffer->GetValue(email) ); - CopyToPhonebookEntryField(iEntries[index].iEmail, email); - break; - } - default: - { - iPhoneBookBuffer->SkipValue(dataType); - break; - } - } - ret = iPhoneBookBuffer->GetTagAndType(fieldTag, dataType); - } - - TRACE_FUNC_EXIT - } - -void CSCPBRCommandHandler::CopyToPhonebookEntryField(TDes8& aDest, const TDesC16& aSrc) - { - TRACE_FUNC_ENTRY - TInt maxLength = aDest.MaxLength(); - if ( aSrc.Length() <= maxLength ) - { - aDest.Copy(aSrc); - } - else - { - aDest.Copy( aSrc.Left(maxLength) ); - } - TRACE_FUNC_EXIT - } - -void CSCPBRCommandHandler::FormatReplyL() - { - TRACE_FUNC_ENTRY - - TInt count = iEntries.Count(); - for (TInt i = 0; i < count; ++i) - { - AppendEntryL(iEntries[i]); - } - iReply.Append(KCRLF); - - TRACE_FUNC_EXIT - } - -void CSCPBRCommandHandler::AppendEntryL(const TPhoneBookEntry& aEntry) - { - TRACE_FUNC_ENTRY - TBuf8 entryBuffer; - aEntry.Externalize(entryBuffer); - - TInt length = entryBuffer.Length() + KSCPBR().Length(); - if (length + iReply.Length() > iReply.MaxLength()) - { - iReply.ReAllocL(iReply.MaxLength()+KBufBlockSize); - } - - iReply.Append(KSCPBR); - iReply.Append(entryBuffer); - TRACE_FUNC_EXIT - } - -void CSCPBRCommandHandler::DoCancel() - { - TRACE_FUNC_ENTRY - switch( iState ) - { - case ESCPBRStateRead: - { - iPhoneBookStore.CancelAsyncRequest( EMobilePhoneStoreRead ); - break; - } - case ESCPBRStateGetPhoneBookInfo: - { - iPhoneBookStore.CancelAsyncRequest( EMobilePhoneStoreGetInfo ); - break; - } - case ESCPBRStateGet3GPBInfo: - { - iPhoneBookStore.CancelAsyncRequest( EGet3GPBInfoIPC ); - break; - } - default: - break; - } - iState = ESCPBRStateIdle; - TRACE_FUNC_EXIT - } - - -void CSCPBRCommandHandler::TPhoneBookEntry::Externalize(TDes8& aDes) const - { - TRACE_FUNC_ENTRY - - aDes.Format(KSCPBRReplyOneEntry, iIndex, &iNumber1, &iNumber2, &iNumber3, &iNumber4, &iName, &iEmail); - - TRACE_FUNC_EXIT - }