--- a/msgconnmanager/src/msgconnmanager.cpp Thu May 27 13:17:17 2010 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1065 +0,0 @@
-/*
-* Copyright (c) 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: Connection manager
-*
-*/
-
-
-
-
-// INCLUDE FILES
-#include <in_sock.h>
-#include <es_enum.h>
-#include <f32file.h>
-#include <flogger.h>
-#include "msgconntimer.h"
-#include "msgconnmanager.h"
-
-// ================= MEMBER FUNCTIONS =======================
-//
-
-
-// ----------------------------------------------------------
-// CMsgConnManager::CMsgConnManager
-//
-// ----------------------------------------------------------
-//
-CMsgConnManager::CMsgConnManager() : CActive( EPriorityUserInput + 2 ),
- iProgressStarted( EFalse ),
- iConnectionClosed( ETrue )
-
- {
-
- }
-
-// ----------------------------------------------------------
-// CMsgConnManager::NewL
-//
-// ----------------------------------------------------------
-//
-CMsgConnManager* CMsgConnManager::NewL( const TInt aAccessPoint )
- {
- CMsgConnManager* self = new ( ELeave ) CMsgConnManager();
- CleanupStack::PushL( self );
- self->ConstructL( aAccessPoint );
- CleanupStack::Pop();
- return self;
- }
-
-// ----------------------------------------------------------
-// CMsgConnManager::ConstructL
-//
-// ----------------------------------------------------------
-//
-void CMsgConnManager::ConstructL( const TInt aAccessPoint )
- {
- DeleteLogFileL();
- iAccessPointID = aAccessPoint;
- iConnectionTimer = CMsgConnTimer::NewL();
- iCommsDatabase = CCommsDatabase::NewL( EDatabaseTypeUnspecified );
- User::LeaveIfError( iSocketSession.Connect() );
- User::LeaveIfError( iConnection.Open( iSocketSession ) );
- iConnectionClosed = EFalse;
- iAccessPointSettings.SetIapId( aAccessPoint );
- iAccessPointSettings.SetDialogPreference( ECommDbDialogPrefDoNotPrompt );
- #ifdef _DEBUG
- WriteToLog( _L8( "CONNMAN: LOGGING ENABLED" ) );
- #endif
- CActiveScheduler::Add( this );
- }
-
-// ----------------------------------------------------
-// CMsgConnManager::~CMsgConnManager
-//
-// ----------------------------------------------------
-//
-CMsgConnManager::~CMsgConnManager()
- {
- #ifdef _DEBUG
- WriteToLog( _L8( "CMsgConnManager::~CMsgConnManager(), Destructor." ) );
- #endif
- Cancel();
- delete iCommsDatabase;
- delete iConnectionTimer;
- iConnection.Close();
- iSocketSession.Close();
- iEventSubscribers.Close();
- }
-
-// ----------------------------------------------------------
-// CMsgConnManager::DeleteLogFileL
-//
-// ----------------------------------------------------------
-//
-void CMsgConnManager::DeleteLogFileL()
- {
- RFs session;
- User::LeaveIfError( session.Connect() );
- CFileMan* manager = CFileMan::NewL( session );
- manager->Delete( _L("C:\\logs\\MsgConnMan\\*.*") );
- session.Close();
- delete manager;
- manager = NULL;
- }
-
-// ---------------------------------------------------------
-// CMsgConnManager::StartBearerObserver
-//
-// ---------------------------------------------------------
-//
-void CMsgConnManager::StartNetworkObserver()
- {
- #ifdef _DEBUG
- WriteToLog( _L8( "CMsgConnManager::StartNetworkObserver() Closed: %d" ), iConnectionClosed );
- #endif
- #ifdef __WINS__
- if( !iConnectionClosed )
- {
- iStatus = KRequestPending;
- SetActive();
- }
- #else
- if( !iConnectionClosed )
- {
- if( !IsActive() )
- {
- iStatus = KRequestPending;
- iConnection.ProgressNotification( iProgressBuffer, iStatus );
- SetActive();
- }
- }
- #endif
- }
-
-// ---------------------------------------------------------
-// CMsgConnManager::RunL()
-//
-// ---------------------------------------------------------
-//
-void CMsgConnManager::RunL()
- {
- #ifdef _DEBUG
- WriteToLog( _L8( "CMsgConnManager::RunL(), iConnManStatus: %d iStatus: %d iStage: %d iError: %d" ),
- iConnManStatus, iStatus.Int(), iProgressBuffer().iStage, iProgressBuffer().iError );
- #endif
- switch( iConnManStatus )
- {
- case EMsgConnManWaitingForStartComplete:
- #ifdef _DEBUG
- WriteToLog( _L8( " Current status is EMsgConnManWaitingForStartComplete." ) );
- #endif
- WatchConnectionOpening();
- break;
- case EMsgConnManWaitingForNotifications:
- #ifdef _DEBUG
- WriteToLog( _L8( " Current status is EMsgConnManWaitingForNotifications." ) );
- #endif
- WatchConnectionOpening();
- break;
- case EMsgConnManObservingAccessPoint:
- #ifdef _DEBUG
- WriteToLog( _L8( " Current status is EMsgConnManObservingAccessPoint." ) );
- #endif
- DetermineConnectionStatusL();
- break;
- case EMsgConnManBearerSuspended:
- #ifdef _DEBUG
- WriteToLog( _L8( " Current status is EMsgConnManBearerSuspended." ) );
- #endif
- DetermineConnectionStatusL();
- break;
- case EMsgConnManDisconnectingPrevious:
- #ifdef _DEBUG
- WriteToLog( _L8( " Timer expired, complete client's request." ) );
- #endif
- User::RequestComplete( iTimedCompleteStatus, KErrNone );
- iConnManStatus = EMsgConnManIdle;
- break;
- case EMsgConnManIdle:
- #ifdef _DEBUG
- WriteToLog( _L8( " Idle, iStatus is %d." ), iStatus.Int() );
- #endif
- break;
- default:
- #ifdef _DEBUG
- WriteToLog( _L8( " Default case, should not be here." ) );
- #endif
- break;
- }
- #ifdef _DEBUG
- WriteToLog( _L8( " RunL() ends" ) );
- #endif
- }
-
-// ----------------------------------------------------
-// CMsgConnManager::WatchConnectionOpening()
-//
-// ----------------------------------------------------
-//
-void CMsgConnManager::WatchConnectionOpening()
- {
- #ifdef _DEBUG
- WriteToLog( _L8( " CMsgConnManager::WatchConnectionOpening() - iProgressStarted: %d" ), iProgressStarted );
- #endif
- //Lets quit right away if it is an error
- if( iStatus != KErrNone )
- {
- #ifdef _DEBUG
- WriteToLog( _L8( " Something wrong, complete with error: %d." ), iStatus.Int() );
- #endif
- iConnectionTimer->Cancel();
- if( iConnManStatus == EMsgConnManWaitingForNotifications )
- iConnection.CancelProgressNotification();
- iConnection.Close();
- iConnectionClosed = ETrue;
- User::RequestComplete( iClientStatus, iStatus.Int() );
- iConnManStatus = EMsgConnManIdle;
- }
- else
- {
- if( iProgressStarted )
- {
- iLastConnectionStage = iProgressBuffer().iStage;
- if( iLastConnectionStage == KLinkLayerOpen ) //we are done
- {
- #ifdef _DEBUG
- WriteToLog( _L8( " Connected. Completing with KErrNone." ) );
- #endif
- iConnectionTimer->Cancel();
- iConnManStatus = EMsgConnManObservingAccessPoint;
- StartNetworkObserver();
- User::RequestComplete( iClientStatus, KErrNone );
- iProgressStarted = EFalse;
- }
- else
- {
- #ifdef _DEBUG
- WriteToLog( _L8( " Keep on waiting for progress." ) );
- #endif
- IssueRequest();
- }
- }
- else
- {
- #ifdef _DEBUG
- WriteToLog( _L8( " Start complete, watch progress." ) );
- #endif
- if( iConnManStatus == EMsgConnManWaitingForStartComplete )
- {
- iProgressStarted = ETrue;
- iConnManStatus = EMsgConnManWaitingForNotifications;
- }
- IssueRequest();
- }
- }
- }
-
-// ----------------------------------------------------
-// CMsgConnManager::DetermineConnectionStatus()
-//
-// ----------------------------------------------------
-//
-void CMsgConnManager::DetermineConnectionStatusL()
- {
- #ifdef _DEBUG
- WriteToLog( _L8( " CMsgConnManager::DetermineConnectionStatus()" ) );
- #endif
- #ifdef __WINS__
- Cancel();
- switch( iStatus.Int() )
- #else
- switch( iProgressBuffer().iStage )
- #endif
- {
- case KLinkLayerClosed:
- case KConnectionUninitialised:
- #ifdef _DEBUG
- CMsgConnManager::WriteToLog( _L8( " KLinkLayerClosed, notify clients of EMsgBearerLost" ) );
- #endif
- Cancel();
- iConnManStatus = EMsgConnManBearerLost;
- BroadcastBearerEventL( EMsgBearerLost );
- iConnection.Close();
- iConnectionClosed = ETrue;
- iEventSubscribers.Reset();
- iConnManStatus = EMsgConnManIdle;
- break;
- case KLinkLayerOpen:
- #ifdef _DEBUG
- WriteToLog( _L8( " KLinkLayerOpen -> GPRS Context Active." ) );
- #endif
- if( iConnManStatus == EMsgConnManBearerSuspended )
- {
- #ifdef _DEBUG
- WriteToLog( _L8( " Moving to active state." ) );
- #endif
- iConnManStatus = EMsgConnManObservingAccessPoint;
- BroadcastBearerEventL( EMsgBearerActive );
- StartNetworkObserver();
- }
- break;
- case KDataTransferTemporarilyBlocked:
- #ifdef _DEBUG
- WriteToLog( _L8( " KDataTransferTemporarilyBlocked -> GPRS Context Suspended." ) );
- #endif
- if( iConnManStatus != EMsgConnManBearerSuspended )
- {
- #ifdef _DEBUG
- WriteToLog( _L8( " Moving to suspended state." ) );
- #endif
- iConnManStatus = EMsgConnManBearerSuspended;
- BroadcastBearerEventL( EMsgBearerSuspended );
- }
- StartNetworkObserver();
- break;
- default:
- #ifdef _DEBUG
- #ifdef __WINS__
- if( iStatus.Int() == KErrCancel )
- WriteToLog( _L8( " Bearer event generation cancelled" ) );
- else
- WriteToLog( _L8( " Some weird status: %d" ), iStatus.Int() );
- #else
- WriteToLog( _L8( " Default case! WTF?!?" ) );
- #endif
- #endif
- StartNetworkObserver();
- break;
- }
- }
-
-// ---------------------------------------------------------
-// CMsgConnManager::CancelStartL
-//
-// ---------------------------------------------------------
-//
-void CMsgConnManager::CancelStartL()
- {
- #ifdef _DEBUG
- WriteToLog( _L8( "CMsgConnManager::CancelStartL()" ) );
- #endif
- if( iClientStatus != NULL && iClientStatus->Int() == KRequestPending )
- {
- if( iConnManStatus == EMsgConnManWaitingForStartComplete ||
- iConnManStatus == EMsgConnManWaitingForNotifications )
- {
- Cancel();
- iEventSubscribers.Reset();
- User::RequestComplete( iClientStatus, KErrCancel );
- iConnManStatus = EMsgConnManIdle;
- iConnectionClosed = ETrue;
- }
- else User::Leave( KErrAbort );
- }
- else User::Leave( KErrAbort );
- }
-
-// ---------------------------------------------------------
-// CMsgConnManager::StopConnection
-//
-// ---------------------------------------------------------
-//
-void CMsgConnManager::StopConnection()
- {
- #ifdef _DEBUG
- WriteToLog( _L8( "CMsgConnManager::StopConnection()" ) );
- #endif
- if( iConnManStatus == EMsgConnManWaitingForStartComplete ||
- iConnManStatus == EMsgConnManWaitingForNotifications ||
- iConnManStatus == EMsgConnManIdle )
- {
- #ifdef _DEBUG
- WriteToLog( _L8( " Status is %d, wrong state for this operation. Abort." ), iConnManStatus );
- #endif
- }
- else
- {
- //If bearer has been lost, we're already closed
- if( iConnManStatus != EMsgConnManBearerLost )
- {
- Cancel();
- iConnection.Close();
- iConnectionClosed = ETrue;
- iEventSubscribers.Reset();
- iConnManStatus = EMsgConnManIdle;
- }
- }
- #ifdef _DEBUG
- WriteToLog( _L8( " StopConnection() ends." ) );
- #endif
- }
-
-// ---------------------------------------------------------
-// CMsgConnManager::StopConnection
-//
-// ---------------------------------------------------------
-//
-void CMsgConnManager::StopConnection( TRequestStatus& aStatus )
- {
- #ifdef _DEBUG
- WriteToLog( _L8( "CImpsConnectionManager::StopConnectionL()" ) );
- #endif
- aStatus = KRequestPending;
- iClientStatus = &aStatus;
- iTimedCompleteStatus = &aStatus;
- if( iConnManStatus == EMsgConnManWaitingForStartComplete ||
- iConnManStatus == EMsgConnManWaitingForNotifications ||
- iConnManStatus == EMsgConnManDisconnectingPrevious ||
- iConnManStatus == EMsgConnManIdle )
- {
- #ifdef _DEBUG
- WriteToLog( _L8( " Status is %d, wrong state for this operation. Abort." ),
- iConnManStatus );
- #endif
- User::RequestComplete( iClientStatus, KErrAbort );
- }
- else
- {
- //If bearer has been lost, we're already closed
- if( iConnManStatus != EMsgConnManBearerLost )
- {
- Cancel();
- iConnection.Close();
- iConnectionClosed = ETrue;
- iEventSubscribers.Reset();
- iConnectionTimer->ActivateTimer( iStatus, 4000000 );
- iConnManStatus = EMsgConnManDisconnectingPrevious;
- SetActive();
- }
- else
- {
- #ifdef _DEBUG
- WriteToLog( _L8( " Bearer lost, nothing to do. Complete with KErrNone" ) );
- #endif
- User::RequestComplete( iClientStatus, KErrNone );
- }
- }
- #ifdef _DEBUG
- WriteToLog( _L8( " StopConnectionL() ends" ) );
- #endif
- }
-
-// ----------------------------------------------------
-// CMsgConnManager::BroadcastBearerEvent
-//
-// ----------------------------------------------------
-//
-void CMsgConnManager::BroadcastBearerEventL( const TMsgBearerEvent aBearerEvent )
- {
- #ifdef _DEBUG
- WriteToLog( _L8( "CMsgConnManager::BroadcastBearerEvent" ) );
- #endif
- TInt subs = iEventSubscribers.Count();
- #ifdef _DEBUG
- WriteToLog( _L8( " %d clients subscribed." ), subs );
- #endif
- if( subs > 0 )
- {
- TBool empty = EFalse;
- MMsgBearerObsCallback* client = NULL;
- for( TInt i = 0;i < subs && !empty;i++ )
- {
- //Just in case:
- //If a client has managed to remove a listener from the queue
- //in the previous callback, "i" will index a bad handle.
- subs = iEventSubscribers.Count();
- if( subs > 0 && i < subs )
- {
- client = iEventSubscribers[i];
- __ASSERT_ALWAYS( client != NULL, User::Panic( _L( "ObserverNULL!" ), 1 ) );
- TInt error = iProgressBuffer().iError;
- if( aBearerEvent == EMsgBearerLost )
- {
- #ifdef _DEBUG
- TInt stage = iProgressBuffer().iStage;
- WriteToLog( _L8( " Event is EMsgBearerLost" ) );
- WriteToLog( _L8( " Stage: %d" ), stage );
- WriteToLog( _L8( " Error: %d" ), error );
- #endif
- }
- TBool authClose = error == KErrConnectionTerminated;
- client->HandleBearerEventL( authClose, aBearerEvent );
- #ifdef _DEBUG
- WriteToLog( _L8(" Client no. %d serviced" ), i );
- #endif
- }
- else
- {
- #ifdef _DEBUG
- WriteToLog( _L8(
- " An event listener was removed inside the callback!" ) );
- #endif
- //Leave the for loop
- empty = ETrue;
- }
- }
- }
- #ifdef _DEBUG
- WriteToLog( _L8( " BroadcastBearerEvent() ends" ) );
- #endif
- }
-
-// ----------------------------------------------------
-// CMsgConnManager::IssueRequest
-//
-// ----------------------------------------------------
-//
-void CMsgConnManager::IssueRequest()
- {
- #ifdef _DEBUG
- WriteToLog( _L8( "CMsgConnManager::IssueRequest(), status: %d" ), IsActive() );
- #endif
- iStatus = KRequestPending;
- iConnection.ProgressNotification( iProgressBuffer, iStatus );
- SetActive();
- }
-
-// ---------------------------------------------------------
-// CMsgConnManager::StartConnection
-//
-// ---------------------------------------------------------
-//
-void CMsgConnManager::StartConnection( TRequestStatus& aStatus )
- {
- #ifdef _DEBUG
- WriteToLog( _L8( "CMsgConnManager::StartConnection() iConnManStatus: %d" ), iConnManStatus );
- #endif
- TInt error = 0;
- aStatus = KRequestPending;
- iClientStatus = &aStatus;
- if( iConnectionClosed )
- {
- error = iConnection.Open( iSocketSession );
- iConnectionClosed = EFalse;
- }
- TBool exists = EFalse;
- TNifProgress progress;
- error = iConnection.Progress( progress );
- #ifdef _DEBUG
- WriteToLog( _L8( " Connection stage: %d error: %d" ), progress.iStage, error );
- #endif
- TRAPD( err, exists = IsValidApL( iAccessPointID ) );
- if( ( error == KErrNone && err == KErrNone ) && exists )
- {
- if( progress.iStage == KConnectionUninitialised )
- HandleNewConnection();
- else
- HandleExistingConnection();
- }
- else
- {
- #ifdef _DEBUG
- WriteToLog( _L8( " Something's wrong, complete with KErrUnknown. IAP exists: %d Error: %d Err: %d" ), exists, error, err );
- #endif
- User::RequestComplete( iClientStatus, KErrUnknown );
- iConnectionClosed = ETrue;
- }
- }
-
-// ---------------------------------------------------------
-// CMsgConnManager::HandleNewConnection
-//
-// ---------------------------------------------------------
-//
-void CMsgConnManager::HandleNewConnection()
- {
- #ifdef _DEBUG
- WriteToLog( _L8( " CMsgConnManager::HandleNewConnection()" ) );
- #endif
- switch( iConnManStatus )
- {
- case EMsgConnManIdle:
- #ifdef _DEBUG
- WriteToLog( _L8( " Current status is EMsgConnManIdle," ) );
- WriteToLog( _L8( " starting to connect IAP: %d" ), iAccessPointSettings.IapId() );
- #endif
- iLastConnectionStage = KConnectionUninitialised;
- iConnection.Start( iAccessPointSettings, iStatus );
- iConnManStatus = EMsgConnManWaitingForStartComplete;
- iConnectionTimer->ActivateTimer( this, 20000000 );
- SetActive();
- break;
- case EMsgConnManDisconnectingPrevious:
- #ifdef _DEBUG
- WriteToLog( _L8( " Current status is EMsgConnManDisconnectingPrevious," ) );
- WriteToLog( _L8( " new connection cannot be started, ignore." ) );
- #endif
- User::RequestComplete( iClientStatus, KErrNotReady );
- break;
- default:
- #ifdef _DEBUG
- WriteToLog( _L8( " We're in some weird state, complete with KErrUnknown" ) );
- #endif
- User::RequestComplete( iClientStatus, KErrUnknown );
- iConnManStatus = EMsgConnManIdle;
- break;
- }
- }
-
-// ---------------------------------------------------------
-// CMsgConnManager::HandleExistingConnection
-//
-// ---------------------------------------------------------
-//
-void CMsgConnManager::HandleExistingConnection()
- {
- #ifdef _DEBUG
- WriteToLog( _L8( " CMsgConnManager::HandleOldConnection()" ) );
- #endif
- switch( iConnManStatus )
- {
- case EMsgConnManDisconnectingPrevious:
- #ifdef _DEBUG
- WriteToLog( _L8( " Current status is EMsgConnManDisconnectingPrevious," ) );
- WriteToLog( _L8( " attempting to open a connection while previous one is still disconnecting. Complete with KErrNotReady." ) );
- #endif
- User::RequestComplete( iClientStatus, KErrNotReady );
- break;
- case EMsgConnManObservingAccessPoint:
- #ifdef _DEBUG
- WriteToLog( _L8( " Current status is EMsgConnManObservingAccessPoint," ) );
- WriteToLog( _L8( " already connected" ) );
- #endif
- User::RequestComplete( iClientStatus, KErrNone );
- break;
- case EMsgConnManWaitingForStartComplete:
- case EMsgConnManWaitingForNotifications:
- #ifdef _DEBUG
- WriteToLog( _L8( " Already connecting, ignore" ) );
- #endif
- User::RequestComplete( iClientStatus, KErrAlreadyExists );
- break;
- default:
- #ifdef _DEBUG
- WriteToLog( _L8( " Unknown state, complete with KErrUnknown." ) );
- #endif
- User::RequestComplete( iClientStatus, KErrUnknown );
- }
- }
-
-// ---------------------------------------------------------
-// CMsgConnManager::HandleTimerEventL
-//
-// ---------------------------------------------------------
-//
-void CMsgConnManager::HandleTimerEvent( TInt /*aStatus*/ )
- {
- #ifdef _DEBUG
- WriteToLog( _L8( "CMsgConnManager::HandleTimerEventL()" ) );
- #endif
- switch( iConnManStatus )
- {
- case EMsgConnManWaitingForNotifications:
- case EMsgConnManWaitingForStartComplete:
- Cancel();
- #ifdef _DEBUG
- WriteToLog( _L8( " Connection initiation timed out, complete with error KErrTimedOut" ) );
- #endif
- User::RequestComplete( iClientStatus, KErrTimedOut );
- iConnection.Close();
- iConnectionClosed = ETrue;
- iConnManStatus = EMsgConnManIdle;
- break;
- default:
- #ifdef _DEBUG
- WriteToLog( _L8( " Default case, problems..." ) );
- #endif
- break;
- }
- }
-
-// ---------------------------------------------------------
-// CMsgConnManager::AddEventSubscriberL
-//
-// ---------------------------------------------------------
-//
-void CMsgConnManager::AddEventSubscriberL( MMsgBearerObsCallback* aClient )
- {
- #ifdef _DEBUG
- WriteToLog( _L8( "CMsgConnManager::AddEventSubscriberL()" ) );
- #endif
- if( iEventSubscribers.Count() < KMaxNumberOfSubscribers )
- User::LeaveIfError( iEventSubscribers.Append( aClient ) );
- else
- {
- #ifdef _DEBUG
- WriteToLog( _L8( " Not allowed to have more than %d clients" ), KMaxNumberOfSubscribers );
- #endif
- User::Leave( KErrAlreadyExists );
- }
- }
-
-// ---------------------------------------------------------
-// CMsgConnManager::RemoveEventSubscriber
-//
-// ---------------------------------------------------------
-//
-void CMsgConnManager::RemoveEventSubscriber( MMsgBearerObsCallback* aClient )
- {
- #ifdef _DEBUG
- WriteToLog( _L8( "CMsgConnManager::RemoveEventSubscriber()" ) );
- #endif
- TInt index = iEventSubscribers.Find( aClient );
- if( index >= 0 )
- {
- iEventSubscribers.Remove( index );
- }
- }
-
-#ifdef _DEBUG
-// ----------------------------------------------------
-// CMsgConnManager::WriteToLog
-//
-// ----------------------------------------------------
-//
-void CMsgConnManager::WriteToLog( TRefByValue<const TDesC8> aFmt,... )
- {
- VA_LIST list;
- VA_START( list, aFmt );
- TBuf8<KConnManLogBufferMaxSize> buf;
- buf.FormatList( aFmt, list );
- RDebug::RawPrint( buf );
- RFileLogger::Write( KConnManLogDir, KConnManLogFile, EFileLoggingModeAppend, buf );
- }
-#endif
-
-// ----------------------------------------------------
-// CMsgConnManager::SetAccessPointIDL
-//
-// ----------------------------------------------------
-//
-void CMsgConnManager::SetAccessPointIDL( const TInt aAccessPointID )
- {
- #ifdef _DEBUG
- WriteToLog( _L8( "CMsgConnManager::SetAccessPointIDL: %d" ), aAccessPointID );
- #endif
- if( IsValidApL( aAccessPointID ) )
- {
- iAccessPointID = aAccessPointID;
- iAccessPointSettings.SetIapId( iAccessPointID );
- iAccessPointSettings.SetDialogPreference( ECommDbDialogPrefDoNotPrompt );
- }
- else
- {
- #ifdef _DEBUG
- WriteToLog( _L8( " The specified AP does not exist, leaves with KErrNotFound" ) );
- #endif
- User::Leave( KErrNotFound );
- }
- }
-
-// ----------------------------------------------------
-// CMsgConnManager::NumberOfActiveConns
-//
-// ----------------------------------------------------
-//
-TInt CMsgConnManager::NumberOfActiveConns()
- {
- TUint count = 0;
- TInt error = KErrNone;
- if( !iConnectionClosed )
- {
- error = iConnection.EnumerateConnections( count );
- }
- #ifdef _DEBUG
- WriteToLog( _L8( "CMsgConnManager::NumberOfActiveConns() Conns: %d Error: %d" ), count, error );
- #endif
- return KErrNone == error ? count : error;
- }
-
-// ---------------------------------------------------------
-// CMsgConnManager::ReadFromCommsDbLC
-//
-// ---------------------------------------------------------
-//
-HBufC* CMsgConnManager::ReadFromCommsDbLC( const TSupportedCommDbRecords aParameter )
- {
- #ifdef _DEBUG
- WriteToLog( _L8( "CMsgConnManager::ReadFromCommsDbLC()" ) );
- #endif
- TPtrC dbRecord;
- HBufC* value = NULL;
- CCommsDbTableView* view = NULL;
- TInt error = InitCommDbViewLC( dbRecord, view, aParameter );
- if( error == KErrNone )
- {
- TDbColType colType;
- TUint32 attribute = 0;
- view->ReadTypeAttribL( dbRecord, colType, attribute );
- switch( colType )
- {
- case EDbColBit:
- break;
- case EDbColUint32:
- {
- TUint32 intValue = 0;
- _LIT( KProxyPort,"%d" );
- view->ReadUintL( dbRecord, intValue );
- value = HBufC::NewLC( sizeof( KProxyPort ) );
- TPtr portPtr( value->Des() );
- portPtr.Format( KProxyPort, intValue );
- value->Des().Copy( portPtr );
- }
- break;
- case EDbColText8:
- break;
- case EDbColText16:
- break;
- case EDbColLongText16:
- value = view->ReadLongTextLC( dbRecord );
- break;
- default:
- break;
- }
- if( value != NULL )
- {
- #ifdef _DEBUG
- HBufC8* temp = HBufC8::NewL( value->Des().Length() );
- TPtr8 ptr( temp->Des() );
- ptr.Copy( *value );
- WriteToLog( _L8( " Value was found: %S" ), &ptr );
- delete temp;
- temp = NULL;
- #endif
- CleanupStack::Pop(); //value
- CleanupStack::PopAndDestroy(); //view
- CleanupStack::PushL( value ); //Put it back in
- }
- else
- {
- #ifdef _DEBUG
- WriteToLog( _L8( " No proxy address defined in CommDb" ) );
- #endif
- CleanupStack::PopAndDestroy(); //view
- }
- }
- else
- {
- #ifdef _DEBUG
- WriteToLog( _L8( " Error: %d" ), error );
- #endif
- }
- return value;
- }
-
-// ---------------------------------------------------------
-// CMsgConnManager::InitCommDbViewLC
-//
-// ---------------------------------------------------------
-//
-TInt CMsgConnManager::InitCommDbViewLC( TPtrC& aDbRecord,
- CCommsDbTableView*& aView,
- const TSupportedCommDbRecords aParameter )
- {
- #ifdef _DEBUG
- WriteToLog( _L8( " CMsgConnManager::InitCommDbViewLC" ) );
- #endif
- aView = iCommsDatabase->OpenViewMatchingUintLC
- ( TPtrC( IAP ), TPtrC( COMMDB_ID ), iAccessPointID );
- TInt error = aView->GotoFirstRecord();
- if( error == KErrNone )
- {
- error = DetermineRecordTypeLC( aDbRecord, aView, aParameter );
- #ifdef _DEBUG
- if( error != KErrNone )
- WriteToLog( _L8( " DetermineRecordType() failed - Error: %d" ), error );
- #endif
- }
- else
- {
- #ifdef _DEBUG
- WriteToLog( _L8( " No matching view found - Error: %d" ), error );
- #endif
- CleanupStack::PopAndDestroy(); //aView
- aView = NULL;
- }
- return error;
- }
-
-// ---------------------------------------------------------
-// CMsgConnManager::DetermineRecordType
-//
-// ---------------------------------------------------------
-//
-TInt CMsgConnManager::DetermineRecordTypeLC( TPtrC& aDbColumn,
- CCommsDbTableView*& aView,
- const TSupportedCommDbRecords aParameter )
- {
- #ifdef _DEBUG
- WriteToLog( _L8( " CMsgConnManager::DetermineRecordType()" ) );
- #endif
- TInt error = KErrNotFound;
- switch( aParameter )
- {
- case EMsgProxyAddress:
- #ifdef _DEBUG
- WriteToLog( _L8( " Type is EImpsProxyAddress" ) );
- #endif
- if( CheckProxyUsageLC( aView ) )
- {
- error = KErrNone;
- aDbColumn.Set( TPtrC( PROXY_SERVER_NAME ) );
- }
- break;
- case EMsgProxyPort:
- #ifdef _DEBUG
- WriteToLog( _L8( " Type is EImpsProxyPort" ) );
- #endif
- if( CheckProxyUsageLC( aView ) )
- {
- error = KErrNone;
- aDbColumn.Set( TPtrC( PROXY_PORT_NUMBER ) );
- }
- break;
- default:
- #ifdef _DEBUG
- WriteToLog( _L8( " Default case, problems..." ) );
- #endif
- error = KErrNotSupported;
- break;
- }
- return error;
- }
-
-// ---------------------------------------------------------
-// CMsgConnManager::CheckProxyUsageLC
-//
-// ---------------------------------------------------------
-//
-TBool CMsgConnManager::CheckProxyUsageLC( CCommsDbTableView*& aView )
- {
- #ifdef _DEBUG
- WriteToLog( _L8( "CMsgConnManager::CheckProxyUsageL()" ) );
- #endif
- TBool useProxy = EFalse;
- TUint32 serviceIdNumber = 0;
- TBuf<KCommsDbSvrMaxFieldLength> serviceIdText;
- aView->ReadTextL( TPtrC( IAP_SERVICE_TYPE ), serviceIdText );
- aView->ReadUintL( TPtrC( IAP_SERVICE ), serviceIdNumber );
- CleanupStack::PopAndDestroy(); //aView
- aView = NULL;
- aView = iCommsDatabase->OpenViewOnProxyRecordLC( serviceIdNumber, serviceIdText );
- TInt error = aView->GotoFirstRecord();
- if( error == KErrNone )
- {
- aView->ReadBoolL( TPtrC( PROXY_USE_PROXY_SERVER ), useProxy );
- if( !useProxy )
- {
- CleanupStack::PopAndDestroy(); //aView
- aView = NULL;
- }
- }
- else
- {
- #ifdef _DEBUG
- WriteToLog( _L8( " The AP does not use a proxy server." ) );
- #endif
- CleanupStack::PopAndDestroy(); //aView
- aView = NULL;
- }
- return useProxy;
- }
-
-// ---------------------------------------------------------
-// CMsgConnManager::IsValidApL
-//
-// ---------------------------------------------------------
-//
-TBool CMsgConnManager::IsValidApL( TUint32 aUid )
- {
- #ifdef _DEBUG
- WriteToLog( _L8( "CMsgConnManager::IsValidApL()" ) );
- #endif
- CCommsDbTableView* table = iCommsDatabase->OpenViewMatchingUintLC( TPtrC( IAP ),
- TPtrC( COMMDB_ID ),
- aUid );
- TInt res = table->GotoFirstRecord();
- CleanupStack::PopAndDestroy(); // table
- return res == KErrNone;
- }
-
-// ---------------------------------------------------------
-// CMsgConnManager::DoCancel
-//
-// ---------------------------------------------------------
-//
-void CMsgConnManager::DoCancel()
- {
- #ifdef _DEBUG
- WriteToLog( _L8( "CMsgConnManager::DoCancel()" ) );
- #endif
- switch( iConnManStatus )
- {
- case EMsgConnManWaitingForStartComplete:
- #ifdef _DEBUG
- WriteToLog( _L8( " Status is EMsgConnManWaitingForStartComplete" ) );
- #endif
- iConnection.Close();
- iConnectionTimer->Cancel();
- break;
- case EMsgConnManWaitingForNotifications:
- #ifdef _DEBUG
- WriteToLog( _L8( " Status is EMsgConnManWaitingForNotifications" ) );
- #endif
- iConnection.CancelProgressNotification();
- iConnectionTimer->Cancel();
- iConnection.Close();
- break;
- case EMsgConnManDisconnectingPrevious:
- #ifdef _DEBUG
- WriteToLog( _L8( " Status is EMsgConnManDisconnectingPrevious" ) );
- #endif
- iConnectionTimer->Cancel();
- User::RequestComplete( iClientStatus, KErrCancel );
- #ifdef _DEBUG
- WriteToLog( _L8( " StopConnection() terminated, client's request completed." ) );
- #endif
- break;
- case EMsgConnManObservingAccessPoint:
- case EMsgConnManBearerSuspended:
- {
- #ifdef _DEBUG
- WriteToLog( _L8( " Status is %d" ), iConnManStatus );
- #endif
- iConnection.CancelProgressNotification();
- #ifdef __WINS__
- TRequestStatus* status = &iStatus;
- User::RequestComplete( status, KErrCancel );
- #endif
- }
- break;
- case EMsgConnManIdle:
- #ifdef _DEBUG
- WriteToLog( _L8( " Status is EMsgConnManIdle" ) );
- #endif
- break;
- default:
- #ifdef _DEBUG
- WriteToLog( _L8( " Default case" ) );
- #endif
- break;
- }
- }
-
-// ----------------------------------------------------
-// NewImpsConnManL
-// Returns a ConnManager instance
-// ----------------------------------------------------
-//
-EXPORT_C MMsgConnManager* NewMsgConnManagerL( const TInt aDefaultAccessPoint )
- {
- return CMsgConnManager::NewL( aDefaultAccessPoint );
- }
-
-