phoneengine/phoneservices/src/ctiurischemeparser.cpp
changeset 46 bc5a64e5bc3c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phoneengine/phoneservices/src/ctiurischemeparser.cpp	Tue Jul 06 14:15:47 2010 +0300
@@ -0,0 +1,136 @@
+/*!
+* 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: Provides services to parse CTI URIs.
+*
+*/
+
+#include <QRegExp>
+#include "ctiurischemeparser.h"
+#include "qtphonelog.h"
+
+const QString KCtiUriSchemePrefix = "cti:";
+const QString KVisualSeparators("-.() ");
+const QString KCtiPauseChar = ",";
+const QString KCtiWaitChar = "/";
+const QString KDtmfPauseChar = "p";
+const QString KDtmfWaitChar = "w";
+
+/*!
+  CtiUriSchemeParser::CtiUriSchemeParser.
+ */
+CtiUriSchemeParser::CtiUriSchemeParser(QObject* parent)
+    : 
+    UriSchemeParser(parent)
+{
+    PHONE_DEBUG("CtiUriSchemeParser::CtiUriSchemeParser");
+}
+
+
+/*!
+  CtiUriSchemeParser::~CtiUriSchemeParser.
+ */
+CtiUriSchemeParser::~CtiUriSchemeParser()
+{
+    PHONE_DEBUG("CtiUriSchemeParser::~CtiUriSchemeParser");
+}
+
+
+/*!
+  CtiUriSchemeParser::isSupportedUriScheme.
+ */
+bool CtiUriSchemeParser::isSupportedUriScheme(const QString &uri) const
+{
+    PHONE_DEBUG("CtiUriSchemeParser::isSupportedUriScheme");
+    
+    QRegExp expression(QString("^") + KCtiUriSchemePrefix);
+    return uri.contains(expression);
+}
+
+
+/*!
+  CtiUriSchemeParser::parseUri.
+ */
+bool CtiUriSchemeParser::parseUri(
+    const QString &uri,
+    QString &phoneNumber,
+    QString &dtmfString) const
+{
+    PHONE_DEBUG("CtiUriSchemeParser::parseUri");
+    
+    QString dialString = "";
+    
+    if (validateUri(uri)) {
+        dialString = uri.mid(KCtiUriSchemePrefix.length());
+        
+        removeVisualSeparators(dialString);
+        convertToneInputToPostDialDtmfString(dialString);
+    }
+    
+    return UriSchemeParser::parsePhoneDialString(
+        dialString, phoneNumber, dtmfString);
+}
+
+
+/*!
+  CtiUriSchemeParser::validateUri.
+  Validity rules:
+  1. Uri must start with "cti:"
+  2. + -sign may occur only at the beginning of the URI.
+  3. Uri cannot contain tone input only or start with tone input.
+  4. Uri length must be at least 1. 
+  5. Uri must contain only valid characters.
+  5.1. Phone number part cannot contain tone input characters.
+  6. Uri cannot contain multiple wait characters in succession.
+ */
+bool CtiUriSchemeParser::validateUri(const QString &uri) const
+{
+    PHONE_DEBUG("CtiUriSchemeParser::validateUri");
+    
+    bool isValid = false;
+    
+    QRegExp expression(
+        "^cti:\\+?[\\d-\\.\\(\\) ]{1,}([,/][\\d*#,/-\\.\\(\\) ]*)?$");
+    isValid = uri.contains(expression);
+    if (isValid) {
+        QRegExp validateMultipleWaitExp("//+");
+        isValid = !uri.contains(validateMultipleWaitExp);
+    }
+    
+    return isValid;
+}
+
+
+/*!
+  CtiUriSchemeParser::removeVisualSeparators.
+ */
+void CtiUriSchemeParser::removeVisualSeparators(QString &uri) const
+{
+    PHONE_DEBUG("CtiUriSchemeParser::removeVisualSeparators");
+    
+    QRegExp visualSeparatorExp("[" + QRegExp::escape(KVisualSeparators) + "]");
+    uri.remove(visualSeparatorExp);
+}
+
+
+/*!
+  CtiUriSchemeParser::convertToneInputToPostDialDtmfString.
+ */
+void CtiUriSchemeParser::convertToneInputToPostDialDtmfString(
+    QString &uri) const
+{
+    PHONE_DEBUG("CtiUriSchemeParser::convertToneInputToPostDialDtmfString");
+    
+    uri.replace(KCtiWaitChar, KDtmfWaitChar);
+    uri.replace(KCtiPauseChar, KDtmfPauseChar);
+}