phonebookengines/contactsmodel/cntphone/cntphone.cpp
changeset 0 e686773b3f54
child 24 0ba2181d7c28
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/contactsmodel/cntphone/cntphone.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,230 @@
+// Copyright (c) 2001-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 <ecom/implementationproxy.h>
+#include <cntdb.h>
+#include "cntphone.h"
+
+/*
+This is the specification for the implementation of the phone number parser. 
+This has been provided by Pekka Jokela (Nokia).
+
+1.   If the first character of the number is '+',  the  '+' character is
+left out, and the real phone number is considered to begin right after
+that.
+
+ * If there is a '(' as the first character and the plus sign follows then
+  i.e. first two characters = '(+' then they must both be removed and the 
+  real phone number is considered to begin after them
+
+2.   If the number begins with a  '*' or '#' symbol, all characters to
+the last '*' or '#' symbol are ignored, and the real phone number is
+considered to begin right after that.
+
+*    If there is '+' character right after the last '#' or '*', the  '+'
+character is left out, and the real phone number is considered to
+begin after that.
+
+*    If there is '+' character within first five characters, all
+characters to the '+' symbol are ignored, and the real phone number is
+considered to begin right after that.
+
+3.   If the number contains special characters 'p',' w' and '+' , all
+characters after the first special character are ignored.
+
+If the number contains '*' and '#' symbols, i.e. there is a
+supplementary service code or a feature code within the number:
+*    If the code is finished by '*' or by '#  the real phone number can
+be separated easily (refer to the table below, example 1). Even
+possible '+' symbol after the code can be left out (example 2).
+*    If the code is finished by a digit, the real phone number can not be
+separated from the code. In most cases, this is not a problem, because
+only seven last digits are significant for comparison (example 3). If
+there is '+' symbol between the code and the real phone number, the
+'+' has to be within first five characters or otherwise it is
+considered to start a DTMF function. (example 4)
+
+These all match 9461235:
+*#020# 79461235: p123
+*#020# +79461235: p123
+*020 79461235:
+*020 +79461235:
++79461235: +3
++79461235: p123
+(+020) 79461235:
+
+And these something else:
+*#020# 79461235:#p123 -> empty
+*12345+79461235: -> 12345
+*+123+456+++++++++++ ->123
+
+The relevant ETSI specifications are:
+ETSI 02.07 - MS Features. Section B.3.4. 
+ETSI 03.14 - Defines what DTMF digits are.
+ETSI 11.11 - Section 10.5.1. Defines the Separator digit.
+
+*/
+
+
+const TInt KPlusWithinChars = 5;
+const TText KSymbolPause = 'p';
+const TText KSymbolWait = 'w';
+const TText KSymbolPlus = '+';
+const TText KSymbolAsterisk = '*';
+const TText KSymbolHash = '#';
+//const symbol for checking the opening bracket before a plus
+const TText KSymbolOpenBrace = '(';
+
+
+/** 
+ * Extracts the real phone number from a contacts phone number field.
+ * This method strips away any DTMF strings or extended services. An empty 
+ * descriptor is returned in aRawNumber if the field doesn't have a valid phone 
+ * number.
+ * 
+ * @param aTextualNumber Descriptor containing a contacts model phone number field 
+ * @param aRawNumber Descriptor to write the raw number to (loaned by caller)
+ */
+void CContactDefaultPhoneNumberParser::ExtractRawNumber(const TDesC& aTextualNumber, TDes& aRawNumber)
+    {
+	aRawNumber.Zero();
+
+	TInt length = aTextualNumber.Length();
+	if (length==0)
+		{
+		return;	
+		}
+		
+
+	TPtrC numberPtr( aTextualNumber );
+	TUint firstChar = numberPtr[0];
+	
+	//gobble spaces
+	while (TChar(firstChar).IsSpace())
+		{
+		--length;
+		if (length==0)
+			{
+			return;
+			}
+		
+		numberPtr.Set(numberPtr.Right(length));
+		firstChar = numberPtr[0];
+		}
+
+    // Get left hand side
+    if ( firstChar == KSymbolAsterisk || firstChar == KSymbolHash )
+        {
+        //Check if there is plus on first five chars:
+        TInt newStartPlace = numberPtr.Locate( KSymbolPlus );
+        if ( newStartPlace>=KPlusWithinChars || newStartPlace==KErrNotFound )
+            {
+            // There is always star or hash...
+            newStartPlace = Max( numberPtr.LocateReverse(KSymbolAsterisk ) ,numberPtr.LocateReverse( KSymbolHash) );
+            }
+
+        length = length - newStartPlace -1;
+        if ( length <= 0 )
+            {
+            return;
+            }
+        numberPtr.Set( numberPtr.Right( length ) );
+        firstChar = numberPtr[0];
+        }
+
+	//test condition to satisfy the removal of '(' the next if 
+	//statement removes the '+' if needed
+	if ( firstChar == KSymbolOpenBrace )
+		{
+		length--;
+		numberPtr.Set( numberPtr.Right( length ) );
+		// This may be the only character in the descriptor so only access if
+		// 1 or more characters left.
+		if (length > 0 )
+			{
+			firstChar = numberPtr[0];
+			}        
+		}
+
+    if ( firstChar == KSymbolPlus )
+        {
+        length--;
+        numberPtr.Set( numberPtr.Right( length ) );
+        }
+
+	if (length==0)
+		{
+		return;
+		}		
+
+    // Find right hand side
+    TLex numberLexer( numberPtr );
+    for ( ; ; )
+        {
+        TChar nextChar = numberLexer.Peek();
+        if ( !nextChar )
+            {
+            break;
+            }
+
+        if ( nextChar.IsDigit() )
+            {
+            aRawNumber.Append( nextChar );
+            numberLexer.Inc();
+            }
+        else if ( nextChar == KSymbolAsterisk || nextChar == KSymbolHash )
+            {
+            aRawNumber.Zero();
+            return;
+            }
+        else
+            {
+            nextChar.LowerCase();
+            if ( nextChar == KSymbolPause
+                 || nextChar == KSymbolWait
+                 || nextChar == KSymbolPlus)
+                {
+                break;
+                }
+            numberLexer.Inc();
+            }
+        }
+    }
+
+
+
+
+CContactDefaultPhoneNumberParser* CContactDefaultPhoneNumberParser::NewL()
+	{
+	CContactDefaultPhoneNumberParser* self = new (ELeave) CContactDefaultPhoneNumberParser();  // calls c'tor
+	return self;
+	}
+		
+// Export the implementation collection function
+const TImplementationProxy ImplementationTable[] = 
+    {
+    IMPLEMENTATION_PROXY_ENTRY(0x102035FC, 	CContactDefaultPhoneNumberParser::NewL)
+    };
+
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount)
+    {
+    aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);
+
+    return ImplementationTable;
+    }
+
+/**
+ * Standard Epoc32 Dll Entry point
+ */