diff -r 594d59766373 -r 7d48bed6ce0c cellular/telephonysettings/xqbindings/psetwrapper/src/psetcalldivertingwrapper.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cellular/telephonysettings/xqbindings/psetwrapper/src/psetcalldivertingwrapper.cpp Tue Aug 31 15:45:17 2010 +0300 @@ -0,0 +1,376 @@ +/* + * Copyright (c) 2009 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include "psetcalldivertingwrapper.h" +#include "psetcalldivertingwrapper_p.h" +#include "logging.h" + +//Constant +_LIT(KCFInvalidChars,"*#pw"); +_LIT(KCFPlusSign,"+"); + +/*! + PSetCallDivertingWrapper::PSetCallDivertingWrapper + */ +PSetCallDivertingWrapper::PSetCallDivertingWrapper( + CPsetContainer &psetContainer, + QObject *parent) : + QObject(parent), m_psetCallDiverting(NULL), m_emergencyCall(NULL), + m_DefaultNumberListCDes(NULL), m_Priv(NULL) +{ + DPRINT << ": IN"; + + m_Priv = new PSetCallDivertingWrapperPrivate(*this); + QScopedPointer privateImplGuard(m_Priv); + + QT_TRAP_THROWING( + m_psetCallDiverting = psetContainer.CreateCFObjectL( *m_Priv )); + m_psetCallDiverting->SetRequestObserver(m_Priv); + QScopedPointer pSetCallDivertingGuard(m_psetCallDiverting); + + QT_TRAP_THROWING(m_emergencyCall = CPhCltEmergencyCall::NewL( m_Priv )); + QScopedPointer emergencyCallGuard(m_emergencyCall); + + privateImplGuard.take(); + pSetCallDivertingGuard.take(); + emergencyCallGuard.take(); + + DPRINT << ": OUT"; +} + +/*! + PSetCallDivertingWrapper::~PSetCallDivertingWrapper + */ +PSetCallDivertingWrapper::~PSetCallDivertingWrapper() +{ + DPRINT << ": IN"; + + delete m_psetCallDiverting; + delete m_emergencyCall; + + if (m_DefaultNumberListCDes) { + m_DefaultNumberListCDes->Reset(); + delete m_DefaultNumberListCDes; + } + + delete m_Priv; + + DPRINT << ": OUT"; +} + +// -------- Wrapper interface --------- // +/*! + PSetCallDivertingWrapper::setCallDiverting + */ +int PSetCallDivertingWrapper::setCallDiverting( + PSCallDivertingCommand& aSetting, int aBasicServiceGroup) +{ + DPRINT << ": IN"; + + TCallDivertSetting param; + param.iCondition = m_Priv->convert(aSetting.iCondition); + param.iSetting = m_Priv->convert(aSetting.iSetting); + param.iStatus = m_Priv->convert(aSetting.iStatus); + param.iServiceGroup = m_Priv->convert(aSetting.iServiceGroup); + param.iNumber = TPtrC16(aSetting.iNumber.utf16()); + param.iNoReplyTimer = aSetting.iNoReplyTimer; + + int result = validateDivertNumber(param.iNumber); + if (0 == result) { + QT_TRAP_THROWING( + m_psetCallDiverting->SetDivertingL( + param, + static_cast(aBasicServiceGroup))); + } + + DPRINT << ": OUT"; + return result; +} + +/*! + PSetCallDivertingWrapper::getCallDivertingStatus + */ +void PSetCallDivertingWrapper::getCallDivertingStatus( + const PsServiceGroup aServiceGroup, + const PsCallDivertingCondition aCondition, + int aBsc) +{ + DPRINT << ": IN"; + DPRINT << "aServiceGroup : " << aServiceGroup; + DPRINT << "aCondition : " << aCondition; + + QT_TRAP_THROWING( + m_psetCallDiverting->GetDivertingStatusL( + m_Priv->convert(aServiceGroup), + m_Priv->convert(aCondition), + (TBasicServiceGroups)aBsc)); + + DPRINT << ": OUT"; +} + +/*! + PSetCallDivertingWrapper::cancelProcess + */ +void PSetCallDivertingWrapper::cancelProcess() +{ + DPRINT << ": IN"; + + m_psetCallDiverting->CancelCurrentRequest(); + + DPRINT << ": OUT"; +} + +/*! + PSetCallDivertingWrapper::getDefaultNumbers + */ +void PSetCallDivertingWrapper::getDefaultNumbers(QStringList &aDefNumbers) +{ + // QStringList?, max 3 numbers to retrieve. + + DPRINT << ": IN"; + + while (!m_DefaultnumberListQSList.empty()) { + m_DefaultnumberListQSList.removeFirst(); + } + m_DefaultNumberListCDes = new CDesC16ArrayFlat(3); + QT_TRAP_THROWING( + m_psetCallDiverting->GetDefaultNumbersL(*m_DefaultNumberListCDes)); + int count = m_DefaultNumberListCDes->Count(); + for (int i = 0; i < count; i++) { + m_DefaultnumberListQSList.append(QString::fromUtf16( + m_DefaultNumberListCDes->MdcaPoint(i).Ptr(), + m_DefaultNumberListCDes->MdcaPoint(i).Length())); + } + aDefNumbers = m_DefaultnumberListQSList; + m_DefaultNumberListCDes->Reset(); + delete m_DefaultNumberListCDes; + m_DefaultNumberListCDes = NULL; + + DPRINT << ": OUT"; +} + +/*! + PSetCallDivertingWrapper::setNewDefaultNumber + */ +void PSetCallDivertingWrapper::setNewDefaultNumber(QString aNumber) +{ + DPRINT << ": IN"; + + TBuf bufNumber(aNumber.utf16()); + TInt found(KErrNotFound); + TInt loc(KErrNotFound); + m_DefaultNumberListCDes = new CDesC16ArrayFlat(3); + QT_TRAP_THROWING( + m_psetCallDiverting->GetDefaultNumbersL(*m_DefaultNumberListCDes)); + found = m_DefaultNumberListCDes->Find(bufNumber, loc); + m_DefaultNumberListCDes->Reset(); + delete m_DefaultNumberListCDes; + m_DefaultNumberListCDes = NULL; + if (found != KErrNone) { //number is not part of current def.numbers + QT_TRAP_THROWING( + m_psetCallDiverting->SetNewDefaultNumberL(bufNumber)); + } else { + QT_TRAP_THROWING( + m_psetCallDiverting->SwapDefaultNumberL(loc+1)); + } + + DPRINT << ": OUT"; +} + +/*! + * PSetCallDivertingWrapper::getVoiceMailBoxNumber + * @param aNumber empty if not set + * @return -1 if not supported + */ +int PSetCallDivertingWrapper::getVoiceMailBoxNumber( + QString &aNumber, PsService aService) +{ + DPRINT << ": IN"; + + CVoiceMailboxEntry* psetVoiceMailboxEntry = NULL; + CVoiceMailbox* psetVoiceMailBoxScoped = NULL; + QT_TRAP_THROWING(psetVoiceMailBoxScoped = CVoiceMailbox::NewL()); + QScopedPointer psetVoiceMailBox(psetVoiceMailBoxScoped); + + TVoiceMailboxParams psetVoiceMailboxParams; + // Selected mailbox type is voice + psetVoiceMailboxParams.iType = m_Priv->convert(aService); + psetVoiceMailboxEntry = 0; + int ret = 0; + TInt error = psetVoiceMailBox->GetStoredEntry( + psetVoiceMailboxParams, psetVoiceMailboxEntry); + DPRINT << "error: " << error; + if (KErrNotSupported == error) { + ret = -1; + } else if (KErrNone == error) { + // Entry ok, check the number + TPtrC ptrNumber(KNullDesC); + if (KErrNone == psetVoiceMailboxEntry->GetVmbxNumber(ptrNumber)) { + // number ok + aNumber = QString::fromUtf16(ptrNumber.Ptr(), + ptrNumber.Length()); + } + + } else { + // illegal argument + } + + delete psetVoiceMailboxEntry; // Entry ownership was transferred + psetVoiceMailboxEntry = NULL; + + DPRINT << "aVmbxNumber: " << aNumber; + DPRINT << ": OUT"; + return ret; +} + +/*! + * PSetCallDivertingWrapper::queryVoiceMailBoxNumber + * @param aNumber empty if not set + * @return -1 if not supported + */ +int PSetCallDivertingWrapper::queryVoiceMailBoxNumber( + QString &aNumber, PsService aService) +{ + DPRINT << ": IN"; + + CVoiceMailboxEntry* psetVoiceMailboxEntry = NULL; + CVoiceMailbox* psetVoiceMailBoxScoped = NULL; + QT_TRAP_THROWING(psetVoiceMailBoxScoped = CVoiceMailbox::NewL()); + QScopedPointer psetVoiceMailBox(psetVoiceMailBoxScoped); + + TVoiceMailboxParams psetVoiceMailboxParams; + // Selected mailbox type is voice + psetVoiceMailboxParams.iType = m_Priv->convert(aService); + psetVoiceMailboxEntry = 0; + int ret = 0; + TInt error = psetVoiceMailBox->GetStoredEntry( + psetVoiceMailboxParams, psetVoiceMailboxEntry); + + if (KErrNotSupported == error) { + ret = -1; + } else if (KErrNone == error || KErrNotFound == error) { + // No number defined, query new entry from user + error = psetVoiceMailBox->QueryNewEntry( + psetVoiceMailboxParams, psetVoiceMailboxEntry); + + if (KErrNone == error) { + // Save new entry and get the number. + error = psetVoiceMailBox->SaveEntry( *psetVoiceMailboxEntry ); + TPtrC ptrNumber( KNullDesC ); + if ( KErrNone == psetVoiceMailboxEntry->GetVmbxNumber( ptrNumber )) { + // New number ok. + aNumber = QString::fromUtf16(ptrNumber.Ptr(), + ptrNumber.Length()); + } + + } else { + // New number not given. + DPRINT << "New number error: " << error; + } + } else { + // illegal argument + DPRINT << "error: " << error; + } + + delete psetVoiceMailboxEntry; // Entry ownership was transferred + psetVoiceMailboxEntry = NULL; + + DPRINT << "aVmbxNumber: " << aNumber; + DPRINT << ": OUT"; + return ret; +} + +/*! + PSetCallDivertingWrapper::validateDivertNumber + */ +int PSetCallDivertingWrapper::validateDivertNumber( + const TDesC16& aDivertTo) const +{ + DPRINT << ": IN "; + + int result = 0; + + QString diverto = QString::fromUtf16(aDivertTo.Ptr(),aDivertTo.Length()); + DPRINT << "aDivertTo: " << diverto; + TInt noOfInvalidChars = KCFInvalidChars().Length(); + TBool isEmergency(EFalse); + TTelNumber number; + TInt error = m_emergencyCall->IsEmergencyPhoneNumber(aDivertTo, number, + isEmergency); + if ((error == KErrNone) && isEmergency) { + result = KErrGsmSSIllegalOperation; + DPRINT << ": emergency number."; + } else { + // Plus is a special case, as it is accepted as first character. + if (findPlus(aDivertTo)) { + result = KErrGsmSSUnknownAlphabet; + } + for (int index = 0; index < noOfInvalidChars; index++) { + if (aDivertTo.Find(KCFInvalidChars().Mid(index, 1)) == KErrNone) { + result = KErrGsmSSUnknownAlphabet; + DPRINT << ": Invalid divert number. "; + } + } + } + + DPRINT << ": OUT : result " << result; + return result; +} + +/*! + PSetCallDivertingWrapper::findPlus + Seeks '+' from given number. If '+' is first character, it is ignored. + */ +bool PSetCallDivertingWrapper::findPlus(const TDesC16& aDivertTo) const +{ + DPRINT << ": IN "; + + bool plusFound(false); + if (!(aDivertTo.Find(KCFPlusSign) == KErrNotFound)) { + //first char '+', but there can additional '+'s + //ignore first '+' + TPtrC concat = aDivertTo.Right(aDivertTo.Length() - 1); + if (concat.Find(KCFPlusSign) == KErrNone) { + plusFound = true; + DPRINT << ": Invalid divert number. "; + } + } + + DPRINT << ": OUT : plusFound " << plusFound; + return plusFound; +} + +/** + * Get CPsetCallDiverting reference. + */ +CPsetCallDiverting & PSetCallDivertingWrapper::getCPsetCallDiverting() const + { + DPRINT; + + return *m_psetCallDiverting; + } + +// End of File.