--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/phoneclientserver/dialutils/src/DialUtilsImpl.cpp Tue Feb 02 01:11:09 2010 +0200
@@ -0,0 +1,223 @@
+/*
+* Copyright (c) 2004-2005 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: Implementation of DialUtils.
+*
+*/
+
+
+
+// INCLUDE FILES
+
+#include <featmgr.h> // Feature Manager.
+#include "DialUtilsImpl.h" // Interface.
+
+#include <centralrepository.h> // Central repository
+#include <settingsinternalcrkeys.h> // Settings Central Repository keys.
+
+// CONSTANTS
+
+// Prefix change Off. See SharedDataKeys.h and SettingsInternalCRKeys.h
+const TInt KDiUtPrefixChangeOff = 0;
+// Prefix change On. See SharedDataKeys.h and SettingsInternalCRKeys.h
+const TInt KDiUtPrefixChangeOn = 1;
+
+// International prefix.
+_LIT( KDiUtIntPrefix, "+" );
+// International prefix.
+_LIT( KDiUtJapanPrefix, "+81" );
+// Zero prefix.
+_LIT( KDiUtZeroPrefix, "0" );
+
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CDialUtilsImpl::CDialUtilsImpl
+//
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CDialUtilsImpl::CDialUtilsImpl()
+ {
+ }
+
+
+// -----------------------------------------------------------------------------
+// CDialUtilsImpl::ConstructL
+//
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CDialUtilsImpl::ConstructL()
+ {
+ // Sets up TLS, must be done before FeatureManager is used.
+ FeatureManager::InitializeLibL();
+
+ iRepository = CRepository::NewL( KCRUidTelephonySettings );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CDialUtilsImpl::NewL
+//
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CDialUtilsImpl* CDialUtilsImpl::NewL()
+ {
+ CDialUtilsImpl* self = new( ELeave ) CDialUtilsImpl;
+
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop();
+
+ return self;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CDialUtilsImpl::~CDialUtilsImpl
+//
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CDialUtilsImpl::~CDialUtilsImpl()
+ {
+ delete iRepository;
+
+ // Frees the TLS! Must be done after FeatureManager is used.
+ FeatureManager::UnInitializeLib();
+ }
+
+
+
+// -----------------------------------------------------------------------------
+// CDialUtilsImpl::CheckNumber
+//
+//
+// -----------------------------------------------------------------------------
+//
+TInt CDialUtilsImpl::CheckNumber( HBufC& aPhoneNumber )
+ {
+ TInt err = KErrNone;
+ TBool checkPrefix =
+ FeatureManager::FeatureSupported( KFeatureIdJapanPrefixChange );
+
+ if ( checkPrefix )
+ {
+ TInt prefixMode = KDiUtPrefixChangeOff; // Default: Off.
+
+ if ( !err )
+ {
+ err = iRepository->Get(
+ KSettingsDialPrefixChangeMode,
+ prefixMode );
+
+ if ( !err )
+ {
+ // Shared data information is ok, so act according to it.
+ switch ( prefixMode )
+ {
+ case KDiUtPrefixChangeOff:
+ {
+ // Nothing needs to be done, so let the phone number to
+ // be unchanged and just break.
+ break;
+ }
+
+ case KDiUtPrefixChangeOn:
+ {
+ TDiUtPrefixText prefixText;
+
+ err = iRepository->Get(
+ KSettingsDialPrefixText,
+ prefixText );
+
+ if ( !err )
+ {
+ err = CombineTexts( aPhoneNumber.Des(), prefixText );
+ }
+ break;
+ }
+
+ default:
+ // Should never happen, value is corrupted.
+ err = KErrCorrupt;
+ break;
+ }
+ }
+ }
+ }
+ return err;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CDialUtilsImpl::CombineTexts
+//
+//
+// -----------------------------------------------------------------------------
+//
+TInt CDialUtilsImpl::CombineTexts(
+ TPtr aPhoneNumber,
+ const TDiUtPrefixText& aPrefixText ) const
+ {
+ TInt err = KErrNone;
+
+ TInt beginning = 0; // The beginning for replacement.
+ TInt replaceLength = 0; // The string length to be replaced.
+ TInt location = KErrNotFound; // The location of searched string.
+
+ // Try to find Japan prefix.
+ location = aPhoneNumber.Find( KDiUtJapanPrefix );
+ if ( location == beginning )
+ {
+ // The string was found, so make replacement.
+ // Safe because zeroPrefix < KDiUtJapanPrefix.
+ replaceLength = KDiUtJapanPrefix().Length();
+ aPhoneNumber.Replace( beginning, replaceLength, KDiUtZeroPrefix );
+ }
+ else
+ {
+ // Try to find international prefix.
+ location = aPhoneNumber.Find( KDiUtIntPrefix );
+ if ( location == beginning )
+ {
+ replaceLength = KDiUtIntPrefix().Length();
+ // The string was found, so try to make replacement.
+ const TInt phoneNumLength = aPhoneNumber.Length();
+ const TInt prefixLength = aPrefixText.Length();
+
+ TInt stringLength =
+ ( phoneNumLength + prefixLength - replaceLength );
+
+ if ( aPhoneNumber.MaxLength() >= stringLength )
+ {
+ // There is enough space to make this replace.
+ aPhoneNumber.Replace( beginning, replaceLength, aPrefixText );
+ }
+ else
+ {
+ // There is no space to combine the strings, so inform it.
+ err = KErrOverflow;
+ }
+ }
+ }
+
+ return err;
+ }
+
+
+// End of file