cbsatplugin/atmisccmdplugin/src/scpbwcommandhandler.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 19 Aug 2010 10:05:41 +0300
branchRCL_3
changeset 54 0ba996a9b75d
permissions -rw-r--r--
Revision: 201031 Kit: 201033

/*
 * 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 "scpbwcommandhandler.h"
#include <mpbutil.h> 
#include <exterror.h>
#include <etelmmerr.h>

#include "atmisccmdpluginconsts.h"
#include "debug.h"

const TInt KMaxContactEntrySize = 512;
const TInt KMaxTextLength = 64;
const TInt KMaxNumberLength = 64;
const TInt KMaxEmailLength = 64;

CSCPBWCommandHandler* CSCPBWCommandHandler::NewL(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone)
    {
    TRACE_FUNC_ENTRY
    CSCPBWCommandHandler* self = new (ELeave) CSCPBWCommandHandler(aCallback, aATCmdParser, aPhone);
    CleanupStack::PushL(self);
    self->ConstructL();
    CleanupStack::Pop(self);
    TRACE_FUNC_EXIT
    return self;
    }

CSCPBWCommandHandler::CSCPBWCommandHandler(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone) :
    CATCmdAsyncBase(aCallback, aATCmdParser, aPhone)
    {
    TRACE_FUNC_ENTRY
    TRACE_FUNC_EXIT
    }

void CSCPBWCommandHandler::ConstructL()
    {
    TRACE_FUNC_ENTRY
    
    TInt err = iPhoneBookStore.Open(iPhone, KETelIccAdnPhoneBook);
    if (err != KErrNone)
        {
        iState = ESCPBWStateSimStoreNotSupported;
        TRACE_FUNC_EXIT
        return;
        }
    err = iMmCustomAPI.Open(iPhone);
    if (err != KErrNone)
        {
        iPhoneBookStore.Close();
        iState = ESCPBWStateSimStoreNotSupported;
        TRACE_FUNC_EXIT
        return;
        }
    iPhoneBookBuffer = new (ELeave) CPhoneBookBuffer;
    
    iReply.CreateL(KDefaultCmdBufLength);
    iNum1.CreateL(KMaxNumberLength);
    iNum2.CreateL(KMaxNumberLength);
    iNum3.CreateL(KMaxNumberLength);
    iNum4.CreateL(KMaxNumberLength);
    iText.CreateL(KMaxTextLength);
    iEmail.CreateL(KMaxEmailLength);
    iPbData.CreateL(KMaxContactEntrySize);
    
    TRACE_FUNC_EXIT
    }

CSCPBWCommandHandler::~CSCPBWCommandHandler()
    {
    TRACE_FUNC_ENTRY
    Cancel();
    delete iPhoneBookBuffer;
    iPhoneBookStore.Close();
    iMmCustomAPI.Close();
    iPbData.Close();
    iReply.Close();
    iNum1.Close();
    iNum2.Close();
    iNum3.Close();
    iNum4.Close();
    iText.Close();
    iEmail.Close();
    TRACE_FUNC_EXIT
    }

void CSCPBWCommandHandler::HandleCommand(const TDesC8& /*aCmd*/, RBuf8& /*aReply*/, TBool /*aReplyNeeded*/)
    {
    TRACE_FUNC_ENTRY
    
    if (iState != ESCPBWStateIdle)
        {
        // Reply "ERROR" if handler is not in idle
        iCallback->CreateReplyAndComplete(EReplyTypeError);
        TRACE_FUNC_EXIT
        return;
        }
    TInt err = KErrNone;
    
    TAtCommandParser::TCommandHandlerType cmdHandlerType = iATCmdParser.CommandHandlerType();
    
    switch (cmdHandlerType)
        {
        case (TAtCommandParser::ECmdHandlerTypeTest):
            {
            if (iMaxEntries == 0)
                {
                RMobilePhoneBookStore::TMobilePhoneBookInfoV1Pckg pckg(iPhoneBookStoreInfo);
                iPhoneBookStore.GetInfo(iStatus, pckg);
                iState = ESCPBWStateGetPhonebookInfo;
                SetActive();
                }
            else if (iEmailLength == 0)
                {
                iState = ESCPBWStateGet3GPBInfo;
                iMmCustomAPI.Get3GPBInfo(iStatus, i3GPBInfo);
                SetActive();
                }
            else
                {
                // Phonebook info has been obtained
                iReply.Zero();
                iReply.Format(KSCPBWSupportedCmdsList, iMaxEntries, iNumLength, iTextLength, iEmailLength);
                iCallback->CreateReplyAndComplete( EReplyTypeOk, iReply );
                }
            }
            break;
        case (TAtCommandParser::ECmdHandlerTypeSet): 
            {
            ResetParameters();
            TBool isDeleteRequest = EFalse;
            err = ParseParameters(isDeleteRequest);
            Trace(_L("Parse completed, err = %d"), err);
            if (isDeleteRequest)
                {
                // Delete entry at iIndex
                iState = ESCPBWStateDelete;
                iPhoneBookStore.Delete(iStatus, iIndex);
                SetActive();
                }
            else if (err == KErrNone)
                {
                // Create an entry
                err = CreateContactEntry();
                if (err == KErrNone)
                    {
                    iPhoneBookStore.Write(iStatus, iPbData, iIndex);
                    iState = ESCPBWStateWrite;
                    SetActive();
                    }
                else
                    {
                    iCallback->CreateReplyAndComplete( EReplyTypeError );
                    }
                }
            else
                {
                iCallback->CreateReplyAndComplete( EReplyTypeError );
                }
            break;
            }
        default:
            {
            iCallback->CreateReplyAndComplete( EReplyTypeError );
            break;
            }
        }
    
    TRACE_FUNC_EXIT
    }

void CSCPBWCommandHandler::RunL()
    {
    TRACE_FUNC_ENTRY
    
    iReply.Zero();
    TInt err = iStatus.Int();
    Trace(_L("State = %d, err = %d"), iState, err);
    
    if (err == KErrNone)
        {
        switch (iState)
            {
            case ESCPBWStateGetPhonebookInfo:
                {
                Trace(_L("Get info successful."));
                iNumLength = iPhoneBookStoreInfo.iMaxNumLength;
                iTextLength = iPhoneBookStoreInfo.iMaxTextLength;
                iMaxEntries = iPhoneBookStoreInfo.iTotalEntries;
                if (iEmailLength == 0)
                    {
                    iMmCustomAPI.Get3GPBInfo(iStatus, i3GPBInfo);
                    iState = ESCPBWStateGet3GPBInfo;
                    SetActive();
                    }
                else
                    {
                    iReply.Format(KSCPBWSupportedCmdsList, iMaxEntries, iNumLength, iTextLength, iEmailLength);
                    iCallback->CreateReplyAndComplete(EReplyTypeOk, iReply);
                    iState = ESCPBWStateIdle;
                    }
                }
                break;
            case ESCPBWStateGet3GPBInfo:
                {
                Trace(_L("Get 3GPB info successful."));
                iEmailLength = i3GPBInfo.iMaxLenEmail;
                iReply.Format(KSCPBWSupportedCmdsList, iMaxEntries, iNumLength, iTextLength, iEmailLength);
                iCallback->CreateReplyAndComplete(EReplyTypeOk, iReply);
                iState = ESCPBWStateIdle;
                }
                break;
            case ESCPBWStateWrite:
                {
                Trace(_L("Write successful. Index = %d"), iIndex);
                iCallback->CreateReplyAndComplete(EReplyTypeOk);
                iState = ESCPBWStateIdle;
                }
                break;
            case ESCPBWStateDelete:
                {
                Trace(_L("Delete successful."));
                iCallback->CreateReplyAndComplete(EReplyTypeOk);
                iState = ESCPBWStateIdle;
                }
                break;
            default:
                {
                iState = ESCPBWStateIdle;
                iCallback->CreateReplyAndComplete(EReplyTypeError);
                break;
                }
            }
        }
    else
        {
        iState = ESCPBWStateIdle; 
        iCallback->CreateCMEReplyAndComplete(err);
        }
    
    TRACE_FUNC_EXIT
    }

void CSCPBWCommandHandler::DoCancel() 
    {
    TRACE_FUNC_ENTRY
    
    switch (iState)
        {
        case ESCPBWStateGetPhonebookInfo:
            {
            iPhoneBookStore.CancelAsyncRequest(EMobilePhoneStoreGetInfo);
            }
            break;
        case ESCPBWStateGet3GPBInfo:
            {
            iMmCustomAPI.CancelAsyncRequest(EGet3GPBInfoIPC);
            }
            break;
        case ESCPBWStateDelete:
            {
            iPhoneBookStore.CancelAsyncRequest(EMobilePhoneStoreDelete);
            }
            break;
        case ESCPBWStateWrite:
            {
            iPhoneBookStore.CancelAsyncRequest(EMobilePhoneStoreWrite);
            }
            break;
        }
    iState = ESCPBWStateIdle;
    
    TRACE_FUNC_EXIT
    }

TInt CSCPBWCommandHandler::ParseParameters( TBool& aIsDeleteRequest )
    {
    TRACE_FUNC_ENTRY
    
    TInt ret = KErrNone;
    // Paese index
    ret = iATCmdParser.NextIntParam(iIndex); 
    Trace(_L("Parse index err: %d"), ret);
    Trace(_L("index: %d"), iIndex);
    if (ret != KErrNone && ret != KErrNotFound)
        {
        // Bad index
        TRACE_FUNC_EXIT
        return KErrArgument;
        }
    
    TPtrC8 ptrc;
    // Parse num1
    ptrc.Set(iATCmdParser.NextParam());
    if (ptrc.Length() != 0)
        {
        Trace(_L("Parse num1 OK: %S"), &ptrc);
        SetBuffer(iNum1, ptrc);
        }
    else if (ret == KErrNone )
        {
        // Only index given
        Trace(_L("Only index given."));
        aIsDeleteRequest = ETrue;
        TRACE_FUNC_EXIT
        return KErrNone;
        }
    else 
        {
        // no num1 found
        TRACE_FUNC_EXIT
        return KErrArgument;
        }
    ret = iATCmdParser.NextIntParam(iType1);
    if (ret == KErrNotFound)
        {
        TRACE_FUNC_EXIT
        return KErrNone;
        }
    else if (ret != KErrNone)
        {
        TRACE_FUNC_EXIT
        return KErrArgument;
        }
    
    // Parse num2
    ptrc.Set(iATCmdParser.NextParam());
    if (ptrc.Length() != 0)
        {
        Trace(_L("Parse num2 OK: %S"), &ptrc);
        SetBuffer(iNum2, ptrc);
        }
    else 
        {
        // no num2 found
        TRACE_FUNC_EXIT
        return KErrNone;
        }
    ret = iATCmdParser.NextIntParam(iType2);
    if (ret == KErrNotFound)
        {
        TRACE_FUNC_EXIT
        return KErrNone;
        }
    else if (ret != KErrNone)
        {
        TRACE_FUNC_EXIT
        return KErrArgument;
        }
    
    // Parse num3
    ptrc.Set(iATCmdParser.NextParam());
    if (ptrc.Length() != 0)
        {
        Trace(_L("Parse num3 OK: %S"), &ptrc);
        SetBuffer(iNum3, ptrc);
        }
    else
        {
        // no num3 found
        TRACE_FUNC_EXIT
        return KErrNone;
        }
    ret = iATCmdParser.NextIntParam(iType3);
    if (ret == KErrNotFound)
        {
        TRACE_FUNC_EXIT
        return KErrNone;
        }
    else if (ret != KErrNone)
        {
        TRACE_FUNC_EXIT
        return KErrArgument;
        }
    
    // Parse num4
    ptrc.Set(iATCmdParser.NextParam());
    if (ptrc.Length() != 0)
        {
        Trace(_L("Parse num4 OK: %S"), &ptrc);
        SetBuffer(iNum4, ptrc);
        }
    else
        {
        // no num4 found
        TRACE_FUNC_EXIT
        return KErrNone;
        }
    ret = iATCmdParser.NextIntParam(iType4);
    if (ret == KErrNotFound)
        {
        TRACE_FUNC_EXIT
        return KErrNone;
        }
    else if (ret != KErrNone)
        {
        TRACE_FUNC_EXIT
        return KErrArgument;
        }
    
    // Parse text
    ptrc.Set(iATCmdParser.NextParam());
    if (ptrc.Length() != 0)
        {
        Trace(_L("Parse text OK: %S"), &ptrc);
        SetBuffer(iText, ptrc);
        }
    else
        {
        // no text found
        TRACE_FUNC_EXIT
        return KErrNone;
        }
    ret = iATCmdParser.NextIntParam(iCoding);
    if (ret == KErrNotFound)
        {
        TRACE_FUNC_EXIT
        return KErrNone;
        }
    else if (ret != KErrNone)
        {
        TRACE_FUNC_EXIT
        return KErrArgument;
        }
    
    // Parse email
    ptrc.Set(iATCmdParser.NextParam());
    if (ptrc.Length() != 0)
        {
        Trace(_L("Parse email OK: %S"), &ptrc);
        SetBuffer(iEmail, ptrc);
        }
    else
        {
        // no email found
        TRACE_FUNC_EXIT
        return KErrNone;
        }
    
    if (iATCmdParser.NextParam().Length() != 0)
        {
        // too many parameters
        Trace(_L("Too many parameters."));
        TRACE_FUNC_EXIT
        return KErrArgument;
        }
    
    TRACE_FUNC_EXIT
    return KErrNone;
    }

TInt CSCPBWCommandHandler::CreateContactEntry()
    {
    TRACE_FUNC_ENTRY
    
    TInt err = KErrNone;
    iPhoneBookBuffer->Set(&iPbData);
    // Add new entry tag
    err = iPhoneBookBuffer->AddNewEntryTag();
    Trace(_L("New entry tag added, err = %d"), err);
    if (err != KErrNone)
        {
        TRACE_FUNC_EXIT
        return err;
        }
    // Put index into the entry
    err = iPhoneBookBuffer->PutTagAndValue(RMobilePhoneBookStore::ETagPBAdnIndex, (TUint16)iIndex);
    Trace(_L("Index added, err = %d"), err);
    if (err != KErrNone)
        {
        TRACE_FUNC_EXIT
        return err;
        }
    // Put text into the entry
    if (iText.Length() != 0)
        {
        err = iPhoneBookBuffer->PutTagAndValue(RMobilePhoneBookStore::ETagPBText, iText);
        Trace(_L("Text added, err = %d"), err);
        if (err != KErrNone)
            {
            TRACE_FUNC_EXIT
            return err;
            }
        }
    // Put num1 into the entry
    if (iNum1.Length() != 0)
        {
        err = iPhoneBookBuffer->PutTagAndValue(RMobilePhoneBookStore::ETagPBNumber, iNum1);
        Trace(_L("Number 1 added, err = %d"), err);
        if (err != KErrNone)
            {
            TRACE_FUNC_EXIT
            return err;
            }
        }
    // Put num2 into the entry
    if (iNum2.Length() != 0)
        {
        // Add anr tag 
        err = iPhoneBookBuffer->AddNewNumberTag();
        Trace(_L("New number tag added, err = %d"), err);
        if (err != KErrNone)
            {
            TRACE_FUNC_EXIT
            return err;
            }
        err = iPhoneBookBuffer->PutTagAndValue(RMobilePhoneBookStore::ETagPBNumber, iNum2);
        Trace(_L("Number 2 added, err = %d"), err);
        if (err != KErrNone)
            {
            TRACE_FUNC_EXIT
            return err;
            }
        }
    // Put num3 into the entry
    if (iNum3.Length() != 0)
        {
        // Add anr tag 
        err = iPhoneBookBuffer->AddNewNumberTag();
        Trace(_L("New number tag added, err = %d"), err);
        if (err != KErrNone)
            {
            TRACE_FUNC_EXIT
            return err;
            }
        err = iPhoneBookBuffer->PutTagAndValue(RMobilePhoneBookStore::ETagPBNumber, iNum3);
        Trace(_L("Number 3 added, err = %d"), err);
        if (err != KErrNone)
            {
            TRACE_FUNC_EXIT
            return err;
            }
        }
    // Put num4 into the entry
    if (iNum4.Length() != 0)
        {
        // Add anr tag 
        err = iPhoneBookBuffer->AddNewNumberTag();
        Trace(_L("New number tag added, err = %d"), err);
        if (err != KErrNone)
            {
            TRACE_FUNC_EXIT
            return err;
            }
        err = iPhoneBookBuffer->PutTagAndValue(RMobilePhoneBookStore::ETagPBNumber, iNum4);
        Trace(_L("Number 4 added, err = %d"), err);
        if (err != KErrNone)
            {
            TRACE_FUNC_EXIT
            return err;
            }
        }    
    // Put email address into the entry
    if (iEmail.Length() != 0)
        {
        err = iPhoneBookBuffer->PutTagAndValue(RMobilePhoneBookStore::ETagPBEmailAddress, iEmail);
        Trace(_L("Email added, err = %d"), err);
        if (err != KErrNone)
            {
            TRACE_FUNC_EXIT
            return err;
            }
        }
    
    TRACE_FUNC_EXIT
    return KErrNone;
    }

void CSCPBWCommandHandler::ResetParameters()
    {
    TRACE_FUNC_ENTRY
    
    iPbData.Zero();
    iIndex = -1;
    iNum1.Zero();
    iType1 = 0x91; // International & ISDN
    iNum2.Zero();
    iType2 = 0x91;
    iNum3.Zero();
    iType3 = 0x91;
    iNum4.Zero();
    iType4 = 0x91;
    iText.Zero();
    iCoding = 0; // GSM 7 bit
    iEmail.Zero();
    
    TRACE_FUNC_EXIT
    }

void CSCPBWCommandHandler::SetBuffer(TDes& aDest, const TDesC8& aSource)
    {
    TRACE_FUNC_ENTRY
    TInt maxLength = aDest.MaxLength();
    if (aSource.Length() <= maxLength)
        {
        aDest.Copy(aSource);
        }
    else
        {
        aDest.Copy(aSource.Left(maxLength));
        }
    TRACE_FUNC_EXIT
    }