phoneengine/phoneservices/src/telurischemeparser.cpp
author hgs
Fri, 15 Oct 2010 12:58:46 +0300
changeset 78 baacf668fe89
parent 46 bc5a64e5bc3c
permissions -rw-r--r--
201041

/*!
* 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: TEL URI parser.
*
*/

#include <QRegExp>
#include <QStringList>
#include "telurischemeparser.h"
#include "qtphonelog.h"

const QString KTelUriSchemaPrefix = "tel:";
const QString KPostDialTag = "postd=";
const QString KSharpDigit = "%23"; 
const QChar KSplit = ';';
const QChar KSharpDigitHex = '#';
const QChar KPauseDigit = 'p';

const QString KWhitespacesAndVisuals = "[\\s,.\\[\\]\\(\\)\\-]";
const QString KInvalidTelNum = "[^\\d\\+]";
const QString KInvalidPostDial = "[^\\d*#pw]";
const QString KNotJustWaitsAndPauses = "[^pw]";

/*!
  TelUriSchemeParser::TelUriSchemeParser.
 */
TelUriSchemeParser::TelUriSchemeParser(QObject* parent) 
    : 
    UriSchemeParser(parent)
{
    PHONE_DEBUG("TelUriSchemeParser::TelUriSchemeParser");
}


/*!
  TelUriSchemeParser::~TelUriSchemeParser.
 */
TelUriSchemeParser::~TelUriSchemeParser()
{
    PHONE_DEBUG("TelUriSchemeParser::~TelUriSchemeParser");
}


/*!
  TelUriSchemeParser::isSupportedUriScheme.
 */
bool TelUriSchemeParser::isSupportedUriScheme(const QString &uri) const
{
    PHONE_DEBUG("TelUriSchemeParser::isSupportedUriScheme");
    
    QRegExp expression(QString("^") + KTelUriSchemaPrefix);
    return uri.contains(expression);
}


/*!
  TelUriSchemeParser::parseUri.
  Accepted Uri's:
  1. Uri must start with "tel:1*phonedigit"
  2. Only "tel:1*phonedigit" and 
     ";postd=1*(phonedigit / dtmf-digit / pause-character)" tags are recognized
  3. DTMF digits "A" "B" "C" and "D" are not supported
  4. ";postd=" can't contain only pause-characters "p" "w" 
  5. ";postd=" can contain only '*''#''%23''0123456789''p''w' characters
  6. ";postd=" should start 'p' character, if not it's inserted
 */
bool TelUriSchemeParser::parseUri(
    const QString &uri,
    QString &phoneNumber,
    QString &dtmfString) const
{
    PHONE_DEBUG("TelUriSchemeParser::parseUri");
    QString dialString = "";
    QString postNum;
    
    if (uri.startsWith(KTelUriSchemaPrefix,Qt::CaseInsensitive)) {
        dialString = uri;
        dialString.remove(QRegExp(KWhitespacesAndVisuals));
        QStringList list = dialString.split(KSplit);
        dialString = list.at(0).mid(KTelUriSchemaPrefix.length());
        if (dialString.contains(QRegExp(KInvalidTelNum))) {
            dialString.clear();
        } else{
            for(int i = 1; i < list.count(); i++){
                if(list.at(i).startsWith(KPostDialTag,Qt::CaseInsensitive)){
                    postNum = list.at(i).mid(KPostDialTag.length());
                    //found, check sharp digit
                    int ndx = postNum.indexOf(KSharpDigit);
                    while(-1 != ndx){
                        postNum.replace(ndx, KSharpDigit.length(),KSharpDigitHex);
                        ndx = postNum.indexOf(KSharpDigit);
                    }
                    //now check if it's valid
                    if(postNum.contains(QRegExp(KInvalidPostDial))||
                        !postNum.contains(QRegExp(KNotJustWaitsAndPauses))){
                        postNum.clear();
                    }else{
                        //finally check it's starting with 'p'
                        if(KPauseDigit != postNum.at(0)){
                            postNum.insert(0,KPauseDigit);
                        }
                        dialString += postNum;
                    }
                }
            }
        }
    }
    
    PHONE_DEBUG2("TelUriSchemeParser::parseUri: ", dialString);
    return UriSchemeParser::parsePhoneDialString(
        dialString, phoneNumber, dtmfString);
}