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 <QtGlobal>
+#include <rsssettings.h>
+#include <psetcontainer.h>
+#include <psetcalldiverting.h>
+#include <mmlist.h>
+#include <cphcltemergencycall.h>
+#include <badesca.h>
+#include <cvoicemailbox.h>
+#include <cvoicemailboxentry.h>
+#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<PSetCallDivertingWrapperPrivate> privateImplGuard(m_Priv);
+
+ QT_TRAP_THROWING(
+ m_psetCallDiverting = psetContainer.CreateCFObjectL( *m_Priv ));
+ m_psetCallDiverting->SetRequestObserver(m_Priv);
+ QScopedPointer<CPsetCallDiverting> pSetCallDivertingGuard(m_psetCallDiverting);
+
+ QT_TRAP_THROWING(m_emergencyCall = CPhCltEmergencyCall::NewL( m_Priv ));
+ QScopedPointer<CPhCltEmergencyCall> 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<TBasicServiceGroups>(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<KPsetPhoneNumberLength> 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<CVoiceMailbox> 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<CVoiceMailbox> 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.