--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/wvuing/IMPSConnectionUI/ConnectionSrc/CIMPSConnectionUiAgentImp.cpp Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,389 @@
+/*
+* 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: IMPS Connection UI Agent implementation.
+*
+*/
+
+// INCLUDE FILES
+#include <E32std.h>
+#include <cimpsconnuiclntfilteredpreseventnotifierng.h>
+
+#include "CIMPSConnectionUiAgentImp.h"
+#include "MCnUiUiFacade.h"
+
+#include "CnUiCommon.hrh"
+#include "CCnUiClientGroupUiNotifyHandler.h"
+#include "CCnUiClientGroupUiConnectionLostHandler.h"
+#include "MCnUiConnModeHandler.h"
+
+
+
+
+// ================= MEMBER FUNCTIONS =======================
+// Two-phased constructor.
+CIMPSConnectionUiAgentImp* CIMPSConnectionUiAgentImp::NewL( TIMPSConnectionClient aClient )
+ {
+ CIMPSConnectionUiAgentImp* self = new ( ELeave ) CIMPSConnectionUiAgentImp( aClient );
+
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self ); //self
+
+ return self;
+ }
+
+
+// Destructor
+CIMPSConnectionUiAgentImp::~CIMPSConnectionUiAgentImp()
+ {
+ delete iClientGroupRemoteNotifyHandler;
+ delete iClientGroupConnectionLostHandler;
+ delete iClientConnModeHandler;
+
+ delete iUi;
+ delete iClntNotifier;
+ delete iBrandedResourceFileName;
+ }
+
+
+// C++ default constructor can NOT contain any code, that
+// might leave.
+//
+CIMPSConnectionUiAgentImp::CIMPSConnectionUiAgentImp( TIMPSConnectionClient aClient )
+ : iClient( aClient )
+ {
+ }
+
+
+// Symbian OS default constructor can leave.
+void CIMPSConnectionUiAgentImp::ConstructL()
+ {
+ //agent services
+ iClntNotifier = CIMPSConnUiClntFilteredPresEventNotifier::NewL( iClient );
+ iClntNotifier->AddObserverL( this );
+ iClntNotifier->StartL();
+
+ //agent service handlers
+ iClientGroupRemoteNotifyHandler = CCnUiClientGroupUiNotifyHandler::NewL( iClient );
+ }
+
+// -----------------------------------------------------------------------------
+// CIMPSConnectionUiAgentImp::StartServiceL()
+// -----------------------------------------------------------------------------
+//
+TInt CIMPSConnectionUiAgentImp::StartServiceL( TIMPSConnectionUiAgentService aService )
+ {
+ switch ( aService )
+ {
+ case EIMPSNotifyActiveConnectionLostReasons:
+ {
+ if ( !iClientGroupConnectionLostHandler )
+ {
+ iClientGroupConnectionLostHandler =
+ CCnUiClientGroupUiConnectionLostHandler::NewL( iClient );
+ }
+
+ break;
+ }
+
+ case EIMPSQueryActiveConnectionScheduledClose:
+ {
+ if ( iBrandedResourceFileName )
+ {
+ iClientGroupRemoteNotifyHandler->UseResourceFileL( *iBrandedResourceFileName );
+ }
+ else
+ {
+ iClientGroupRemoteNotifyHandler->UseResourceFileL( KNullDesC() );
+ }
+
+ iClientGroupRemoteNotifyHandler->SetHandled(
+ ECGQActiveConnectionScheduledClose,
+ ETrue );
+ break;
+ }
+
+
+ case EIMPSQueryActiveConnectionSuppressForScheduledConnection:
+ {
+ if ( iBrandedResourceFileName )
+ {
+ iClientGroupRemoteNotifyHandler->UseResourceFileL( *iBrandedResourceFileName );
+ }
+ else
+ {
+ iClientGroupRemoteNotifyHandler->UseResourceFileL( KNullDesC() );
+ }
+ iClientGroupRemoteNotifyHandler->SetHandled(
+ ECGQActiveConnectionSuppressForScheduledConnection,
+ ETrue );
+ break;
+ }
+
+
+ case EIMPSReqisterAsSignificantConnectionClientInScheduling :
+ {
+ if ( !iClientConnModeHandler )
+ {
+ iClientConnModeHandler = CreateConnModeHandlerL();
+ iClientConnModeHandler->CancelRegisteringAsSSClient();
+ }
+ break;
+ }
+
+ default:
+ {
+ break; //unknown service
+ }
+ }
+
+ return KErrNone;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CIMPSConnectionUiAgentImp::StopService()
+// -----------------------------------------------------------------------------
+//
+TInt CIMPSConnectionUiAgentImp::StopService( TIMPSConnectionUiAgentService aService )
+ {
+ switch ( aService )
+ {
+ case EIMPSNotifyActiveConnectionLostReasons:
+ {
+ if ( iClientGroupConnectionLostHandler )
+ {
+ delete iClientGroupConnectionLostHandler;
+ iClientGroupConnectionLostHandler = NULL;
+ }
+ break;
+ }
+
+ case EIMPSQueryActiveConnectionScheduledClose:
+ {
+ iClientGroupRemoteNotifyHandler->SetHandled( ECGQActiveConnectionScheduledClose,
+ EFalse );
+ break;
+ }
+
+
+ case EIMPSQueryActiveConnectionSuppressForScheduledConnection:
+ {
+ iClientGroupRemoteNotifyHandler->SetHandled( ECGQActiveConnectionSuppressForScheduledConnection,
+ EFalse );
+ break;
+ }
+
+
+ case EIMPSReqisterAsSignificantConnectionClientInScheduling :
+ {
+ if ( iClientConnModeHandler )
+ {
+ iClientConnModeHandler->CancelRegisteringAsSSClient();
+ delete iClientConnModeHandler;
+ iClientConnModeHandler = NULL;
+ }
+
+ break;
+ }
+
+ default:
+ {
+ break; //unknown service
+ }
+ }
+
+ return KErrNone;
+ }
+
+
+
+// -----------------------------------------------------------------------------
+// CIMPSConnectionUiAgentImp::StopAllServices()
+// -----------------------------------------------------------------------------
+//
+void CIMPSConnectionUiAgentImp::StopAllServices()
+ {
+ //NOTE!! When adding new services, remember add those also here
+
+ StopService( EIMPSNotifyActiveConnectionLostReasons );
+ StopService( EIMPSQueryActiveConnectionScheduledClose );
+ StopService( EIMPSQueryActiveConnectionSuppressForScheduledConnection );
+ StopService( EIMPSReqisterAsSignificantConnectionClientInScheduling );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CIMPSConnectionUiAgentImp::HandlePresenceEventL()
+// From MIMPSConnUiPresenceEventObserver
+// -----------------------------------------------------------------------------
+//
+void CIMPSConnectionUiAgentImp::HandlePresenceEventL( CIMPSConnUiPresEventNotifier* /*aNotifier*/,
+ const CPEngNWSessionSlotID2& /*aSessionSlotID*/,
+ TIMPSConnectionClient /*aClient*/,
+ TIMPSPresenceServiceEvent aEvent )
+ {
+ MCnUiUiFacade* tempUi = CreateUiFacadeL();
+ if ( iUi )
+ {
+ delete iUi;
+ }
+ iUi = tempUi;
+
+ if ( iBrandedResourceFileName )
+ {
+
+ if ( iUi )
+ {
+ iUi->SwitchResourceFileL( *iBrandedResourceFileName );
+ }
+ }
+
+ if ( iClientGroupConnectionLostHandler )
+ {
+ if ( iBrandedResourceFileName )
+ {
+ iClientGroupConnectionLostHandler->UseResourceFileL( *iBrandedResourceFileName );
+ }
+ else
+ {
+ iClientGroupConnectionLostHandler->UseResourceFileL( KNullDesC() );
+ }
+ TRAPD( err, iClientGroupConnectionLostHandler->HandlePresenceEventL( aEvent ) );
+
+
+ //When userA logs in with some user id. Now userB logs in with same user id.
+ //Before UserA gets the notification from network of the server disconnection, userA
+ //tries to exit the application. The Application crashes.
+
+ //Reason:
+ //*******
+ //The UiSessionHandler calls for a HandlePresenceEventL(..) when UserA exits the application.
+ //Before the completion of this handler, the netwrok sends the notification, the current active
+ //object is put on a hold and the network disconnection active object takes the control.
+ //This results in calling the same HandlePresenceEventL(..), wherein the iUi is deleted.
+ //After completion the other thread which was interrupted resumes, and since the iUi was deleted
+ //this thread crashes.
+
+ //Solution:
+ //*********
+ //1: Remove delete which is below. So that some iUi is available for the other
+ //thread to complete. This soln was not followed as this commonUi has to be revamped
+ //take care of the same while revamping this component.
+ //2: better check for iUi before performing any action on the same. This is
+ //now followed as it is simpler solution.
+
+ if ( iUi )
+ {
+ iUi->HandleIfError( err );
+ }
+ }
+
+ if ( iClientGroupRemoteNotifyHandler )
+ {
+ if ( iBrandedResourceFileName )
+ {
+ iClientGroupConnectionLostHandler->UseResourceFileL( *iBrandedResourceFileName );
+ }
+ else
+ {
+ iClientGroupConnectionLostHandler->UseResourceFileL( KNullDesC() );
+ }
+ TRAPD( err, iClientGroupRemoteNotifyHandler->HandlePresenceEventL( aEvent ) );
+
+ if ( iUi )
+ {
+ iUi->HandleIfError( err );
+ }
+ }
+
+ delete iUi;
+ iUi = NULL;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CIMPSConnectionUiAgentImp::HandlePresenceEventNotifyError()
+// From MIMPSConnUiPresenceEventObserver
+// -----------------------------------------------------------------------------
+//
+void CIMPSConnectionUiAgentImp::HandlePresenceEventNotifyError( CIMPSConnUiPresEventNotifier* /*aNotifier*/,
+ TInt aError )
+ {
+ MCnUiUiFacade* tempUi = NULL;
+ // if we don't get facade we just don't show anything
+ TRAPD( err, tempUi = CreateUiFacadeL() );
+ if ( err )
+ {
+ return;
+ }
+
+ if ( iUi )
+ {
+ delete iUi;
+ }
+ iUi = tempUi;
+
+ if ( iBrandedResourceFileName )
+ {
+
+ if ( iUi )
+ {
+ TRAP( err, iUi->SwitchResourceFileL( *iBrandedResourceFileName ) );
+ if ( err != KErrNone )
+ {
+ CActiveScheduler::Current()->Error( err );
+ }
+ }
+ }
+
+
+ if ( iUi )
+ {
+ iUi->HandleIfError( aError );
+ }
+
+ delete iUi;
+ iUi = NULL;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CIMPSConnectionUiAgentImp::UseResourceFileL()
+// -----------------------------------------------------------------------------
+//
+void CIMPSConnectionUiAgentImp::UseResourceFileL( const TDesC& aNewResourceFile )
+ {
+ if ( aNewResourceFile.Length() == 0 )
+ {
+ //empty resource file name ==> use the default resource
+ delete iBrandedResourceFileName;
+ iBrandedResourceFileName = NULL;
+ }
+ else
+ {
+ // use this resourcefile
+ HBufC* tempFile = aNewResourceFile.AllocL();
+ delete iBrandedResourceFileName;
+ iBrandedResourceFileName = tempFile;
+ }
+ }
+
+
+// End of File
+
+
+
+
+