--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/cellular/telephonysettings/src/PsetTelephony.cpp Tue Feb 02 01:11:09 2010 +0200
@@ -0,0 +1,275 @@
+/*
+* Copyright (c) 2002 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: ETEL connection and line opening class.
+*
+*
+*/
+
+
+// INCLUDE FILES
+#include <etelmm.h>
+#include <e32svr.h>
+#include <mmtsy_names.h>
+#include "PsetConstants.h"
+#include "PsetTelephony.h"
+#include "PhoneSettingsLogger.h"
+
+// MEMBER FUNCTIONS
+// ---------------------------------------------------------------------------
+//
+// First phase constructor
+//
+// ---------------------------------------------------------------------------
+//
+CPsetTelephony* CPsetTelephony::NewL(
+ RMobilePhone& aPhone, const TDesC* aTsyName )
+ {
+ CPsetTelephony* self = new ( ELeave ) CPsetTelephony( aPhone );
+ CleanupStack::PushL( self );
+ self->ConstructL( aTsyName );
+ CleanupStack::Pop();
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+//
+// Destructor
+//
+// ---------------------------------------------------------------------------
+//
+CPsetTelephony::~CPsetTelephony()
+ {
+ if ( iOwnConnection )
+ {
+ if ( iPhone )
+ {
+ iPhone->Close();
+ }
+
+ /*****************************************************
+ * Series 60 Customer / ETel
+ * Series 60 ETel API
+ *****************************************************/
+ /*****************************************************
+ * Series 60 Customer / TSY
+ * Needs customer TSY implementation
+ *****************************************************/
+ if ( iTelServer )
+ {
+ iTelServer->UnloadPhoneModule( iTsyName );
+ iTelServer->Close();
+ }
+ delete iTelServer;
+ iTelServer = NULL;
+ delete iPhone;
+ iPhone = NULL;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// Constructor.
+//
+// ---------------------------------------------------------------------------
+//
+void CPsetTelephony::ConstructL( const TDesC* aTsyName )
+ {
+ User::LeaveIfError( ConnectToEtelL( aTsyName ) );
+ iOwnConnection = ETrue;
+ }
+
+// ---------------------------------------------------------------------------
+//
+// Connects to ETel server and loads TSY module, then opens phone object
+// if phone(s) found.
+//
+// ---------------------------------------------------------------------------
+TInt CPsetTelephony::ConnectToEtelL( const TDesC* aTsyName )
+ {
+ __PHSLOGSTRING("[PHS]--> CPsetTelephony::ConnectToEtelL");
+ if ( aTsyName )
+ {
+ iTsyName= *aTsyName; // use specific tsy name
+ }
+ else
+ {
+ iTsyName = KMmTsyModuleName; // use default tsy name
+ }
+
+ iTelServer = new ( ELeave ) RTelServer;
+ iPhone = new ( ELeave ) RMobilePhone;
+ TInt err = KErrNone;
+
+ for ( TInt a = 0 ; a < KPSetRetryCount ; a++ )
+ {
+ err = iTelServer->Connect();
+
+ if ( err == KErrNone )
+ {
+ break;
+ }
+
+ User::After( KPSetRetryTimeout );
+ }
+
+ User::LeaveIfError( err );
+
+ /*****************************************************
+ * Series 60 Customer / ETel
+ * Series 60 ETel API
+ *****************************************************/
+ /*****************************************************
+ * Series 60 Customer / TSY
+ * Needs customer TSY implementation
+ *****************************************************/
+ err = iTelServer->LoadPhoneModule( iTsyName );
+
+ if ( err == KErrNone )
+ {
+ iTelServer->SetExtendedErrorGranularity( RTelServer::EErrorExtended );
+
+ RTelServer::TPhoneInfo phoneInfo;
+ err = iTelServer->GetPhoneInfo( 0, phoneInfo );
+ if ( err == KErrNone )
+ {
+ // open phone subsession
+ err = iPhone->Open( *iTelServer, phoneInfo.iName );
+ }
+ }
+
+ __PHSLOGSTRING("[PHS] <--CPsetTelephony::ConnectToEtelL");
+ return err;
+ }
+
+// ---------------------------------------------------------------------------
+//
+// Checks that correct line for diverting is open. If not, lines
+// are gone through and when one with correct capabilities is found,
+// it is opened.
+//
+// ---------------------------------------------------------------------------
+//
+void CPsetTelephony::CheckLineModeL( const TServiceGroup aServiceGroup,
+ RMobilePhone* aPhone, RMobileLine* aLine)
+ {
+ __PHSLOGSTRING("[PHS]--> CPsetTelephony::CheckLineModeL");
+ if (!aPhone || !aLine)
+ {
+ User::Leave(KErrArgument);
+ }
+
+ RLine::TCaps lineCaps;
+ lineCaps.iFlags = 0;
+ TBool oldMode( EFalse ); // if true, another line must be opened
+
+ if ( aLine->SubSessionHandle() == 0 )
+ {
+ oldMode = ETrue;
+ }
+ else
+ {
+ User::LeaveIfError( aLine->GetCaps( lineCaps ) );
+ }
+
+ TUint32 capsFlags( 0 );
+ capsFlags = SetCapFlagsL( aServiceGroup, oldMode, lineCaps );
+
+ if ( oldMode )
+ { // open line in right mode according to service group
+ if ( aLine->SubSessionHandle() )
+ {
+ aLine->Close();
+ }
+
+ TInt lines = 0;
+ User::LeaveIfError( aPhone->EnumerateLines( lines ) );
+ //lines is no of lines, to check each line, we need to
+ // check all lines from 0 to lines-1
+ for (lines--; KPSetNoLinesAvailable < lines; lines-- )
+ {
+ RPhone::TLineInfo lineInfo;
+ User::LeaveIfError( aPhone->GetLineInfo( lines, lineInfo ) );
+
+ if ( lineInfo.iLineCapsFlags & capsFlags )
+ {
+ User::LeaveIfError( aLine->Open( *aPhone, lineInfo.iName ) );
+ return;
+ }
+ }
+ }
+ __PHSLOGSTRING("[PHS] <--CPsetTelephony::CheckLineModeL");
+ }
+// ---------------------------------------------------------------------------
+//
+// Sets cap flags.
+//
+// ---------------------------------------------------------------------------
+//
+TUint32 CPsetTelephony::SetCapFlagsL(
+ const TServiceGroup aServiceGroup, TBool& aMode, RLine::TCaps& aCaps )
+ {
+ __PHSLOGSTRING("[PHS]--> CPsetTelephony::SetCapFlagsL");
+ TUint32 flags(0);
+
+ switch ( aServiceGroup )
+ {
+ case EServiceGroupVoice:
+ __PHSLOGSTRING("[PHS] CPsetTelephony::SetCapFlagsL: EServiceGroupVoice");
+ // always open voice line even because it could have been another
+ // ALS line which was open
+ aMode = ETrue;
+ flags |= RLine::KCapsVoice;
+ break;
+ case EServiceGroupData:
+ __PHSLOGSTRING("[PHS] CPsetTelephony::SetCapFlagsL: EServiceGroupData");
+ if ( !( aCaps.iFlags & RLine::KCapsData ) )
+ {
+ aMode = ETrue;
+ }
+ flags |= RLine::KCapsData;
+ break;
+ case EServiceGroupFax:
+ __PHSLOGSTRING("[PHS] CPsetTelephony::SetCapFlagsL: EServiceGroupFax");
+ if ( !( aCaps.iFlags & RLine::KCapsFax ) )
+ {
+ aMode = ETrue;
+ }
+ flags |= RLine::KCapsFax;
+ break;
+ case EServiceGroupAllTeleservices:
+ __PHSLOGSTRING("[PHS] CPsetTelephony::SetCapFlagsL: EServiceGroupAllTeleservices");
+ aMode = ETrue;
+ flags |= RLine::KCapsData;
+ flags |= RLine::KCapsFax;
+ flags |= RLine::KCapsVoice;
+ break;
+ default:
+ User::Leave( KErrNotSupported );
+ }
+
+ __PHSLOGSTRING("[PHS] <--CPsetTelephony::SetCapFlagsL");
+ return flags;
+ }
+
+// ---------------------------------------------------------------------------
+//
+// C++ constructor.
+//
+// ---------------------------------------------------------------------------
+//
+CPsetTelephony::CPsetTelephony
+ ( RMobilePhone& aPhone ) : iPhone ( &aPhone )
+ {
+ }
+//End of file