--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/imstutils/imconversationview/imcvuiengine/src/cimcvenginecchhandler.cpp Wed Sep 01 12:33:36 2010 +0100
@@ -0,0 +1,389 @@
+/*
+* Copyright (c) 2008 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: Class handling the use of Cch
+*
+*/
+
+
+// INCLUDE FILES
+#include <e32def.h>
+#include <cchserver.h>
+#include <cchclient.h>
+#include <spsettings.h>
+#include <spproperty.h>
+#include "cimcvenginefactory.h"
+
+#include "cimcvenginecchhandler.h"
+#include "imcvuiliterals.h"
+
+#include "imcvlogger.h"
+
+// CONSTANTS
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------------------------
+// CIMCVEngineCchHandler::CIMCVEngineCchHandler
+// ---------------------------------------------------------------------------
+//
+CIMCVEngineCchHandler::CIMCVEngineCchHandler(TUint aServiceId,
+ CIMCVEngine& aEngine)
+: iServiceId(aServiceId),
+iEngine(aEngine)
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// CIMCVEngineCchHandler::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CIMCVEngineCchHandler::ConstructL( )
+ {
+ // Create service selection here
+ iCchClient = CCch::NewL();
+
+ if (iCchClient)
+ {
+ CCchService* service = iCchClient->GetService( iServiceId );
+
+ if( service )
+ {
+ service->SetObserver( *this );
+ }
+ }
+ iPrevNwError = 0;
+
+ }
+
+// ---------------------------------------------------------------------------
+// CIMCVEngineCchHandler::NewL
+// ---------------------------------------------------------------------------
+//
+CIMCVEngineCchHandler*
+ CIMCVEngineCchHandler::NewL( TUint aServiceId, CIMCVEngine& aEngine )
+ {
+ CIMCVEngineCchHandler* self = NewLC(aServiceId, aEngine);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CIMCVEngineCchHandler::NewLC
+// ---------------------------------------------------------------------------
+//
+CIMCVEngineCchHandler*
+ CIMCVEngineCchHandler::NewLC(TUint aServiceId, CIMCVEngine& aEngine )
+ {
+ CIMCVEngineCchHandler* self =
+ new (ELeave) CIMCVEngineCchHandler(aServiceId, aEngine);
+ CleanupStack::PushL(self);
+ self->ConstructL( );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CIMCVEngineCchHandler::~CIMCVEngineCchHandler
+// ---------------------------------------------------------------------------
+//
+CIMCVEngineCchHandler::~CIMCVEngineCchHandler()
+ {
+
+ if(iCchClient)
+ {
+ CCchService* service = iCchClient->GetService( iServiceId );
+ if( service )
+ {
+ service->RemoveObserver();
+ }
+ delete iCchClient;
+ }
+
+ }
+
+
+
+// ---------------------------------------------------------------------------
+// CIMCVEngineCchHandler::GetServiceState
+// ---------------------------------------------------------------------------
+//
+TInt CIMCVEngineCchHandler::GetServiceState(
+ TCCHSubserviceState& aCCHState
+ )
+ {
+ TInt err = KErrNone;
+ CCchService* service = iCchClient->GetService( iServiceId );
+ TCchServiceStatus status;
+ status.SetState(ECCHUninitialized);
+
+ if( service )
+ {
+ // Get status from the client
+ err = service->GetStatus( ECCHIMSub, status );
+ }
+
+ aCCHState = status.State();
+
+ return err;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CIMCVEngineCchHandler::EnableService
+// ---------------------------------------------------------------------------
+//
+TInt CIMCVEngineCchHandler::EnableService()
+ {
+
+ // Retrieve service interface from the CCH client to be used to
+ // enable aServiceType
+ CCchService* service = iCchClient->GetService( iServiceId );
+ //Allowing Connectivity Dialogs for cch
+ iCchClient->SetConnectivityDialogsAllowed( ETrue );
+
+ // By default set to fault value; if service pointer is valid then we
+ // return the disable value, otherwise we return KErrNotFound
+ TInt error = KErrNotFound;
+ if( service )
+ {
+
+ error = service->Enable( ECCHUnknown );
+
+ }
+
+
+ return error;
+ }
+
+// ---------------------------------------------------------------------------
+// CIMCVEngineCchHandler::GetAdapterUidL()
+// ---------------------------------------------------------------------------
+//
+TInt CIMCVEngineCchHandler::GetAdapterUidL()
+ {
+ TInt ret = KErrNotFound;
+ CSPProperty* property = CSPProperty::NewLC();
+ CSPSettings* settings = CSPSettings::NewLC();
+ TInt err = settings->FindPropertyL( iServiceId,
+ EPropertyPCSPluginId,*property );
+ if (KErrNone == err)
+ {
+ property->GetValue( ret );
+ }
+ CleanupStack::PopAndDestroy( settings );
+ CleanupStack::PopAndDestroy( property );
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CIMCVEngineCchHandler::GetUserIdL
+// ---------------------------------------------------------------------------
+//
+HBufC* CIMCVEngineCchHandler::GetUserIdL()
+ {
+ HBufC* temp = NULL;
+ CCchService* service = iCchClient->GetService( iServiceId );
+ // By default set to fault value; if service pointer is valid then we
+ // return the disable value, otherwise we return KErrNotFound
+ TInt error = KErrNotFound;
+ if( service )
+ {
+ RBuf username;
+ username.Create(KMAXUSERIDLENGTH);
+ CleanupClosePushL( username );
+ error = service->GetConnectionParameter(ECCHIMSub,ECchUsername,username);
+ User::LeaveIfError( error);
+ if( username.Length() > 0)
+ {
+ temp = username.AllocL(); // ownership transferred
+ }
+ CleanupStack::PopAndDestroy( &username );
+ }
+ return temp;
+ }
+
+
+
+// ---------------------------------------------------------------------------
+// CIMCVEngineCchHandler::DisableService
+// ---------------------------------------------------------------------------
+//
+TInt CIMCVEngineCchHandler::DisableService()
+ {
+
+ // Retrieve service interface from the CCH client to be used to
+ // enable aServiceType
+ CCchService* service = iCchClient->GetService( iServiceId );
+ // By default set to fault value; if service pointer is valid then we
+ // return the disable value, otherwise we return KErrNotFound
+ TInt error = KErrNotFound;
+ if( service )
+ {
+ error = service->Disable( ECCHUnknown );
+ }
+
+
+ return error;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CIMCVEngineCchHandler::IsServiceLoggedIn
+// ---------------------------------------------------------------------------
+//
+TBool CIMCVEngineCchHandler::IsServiceLoggedIn()
+ {
+ TCCHSubserviceState serviceState = ECCHUninitialized;
+
+ TInt error = GetServiceState( serviceState );
+
+ if ( !error && ECCHEnabled == serviceState )
+ {
+ return ETrue;
+ }
+
+ return EFalse;
+
+ }
+
+
+// ---------------------------------------------------------------------------
+// CIMCVEngineCchHandler::ServiceStatusChanged
+// ---------------------------------------------------------------------------
+//
+void CIMCVEngineCchHandler::ServiceStatusChanged(
+ TInt aServiceId,
+ const TCCHSubserviceType aType,
+ const TCchServiceStatus& aServiceStatus )
+ {
+ TRAP_IGNORE(DoHandleServiceStatusChangedL(aServiceId, aType, aServiceStatus));
+ }
+
+
+// ---------------------------------------------------------------------------
+// CIMCVEngineCchHandler::DoHandleServiceStatusChanged
+// ---------------------------------------------------------------------------
+//
+void CIMCVEngineCchHandler::DoHandleServiceStatusChangedL(
+ TInt aServiceId,
+ const TCCHSubserviceType aType,
+ const TCchServiceStatus& aServiceStatus )
+ {
+
+ IM_CV_LOGS(TXT("CVEngineCCHHnadler::DoHandleServiceStatusChangedL ") );
+ IM_CV_LOGS(TXT("CVEngineCCHHnadler::DoHandleServiceStatusChangedL:TCCHSubserviceType=%d"),aType);
+ IM_CV_LOGS(TXT("CVEngineCCHHnadler::DoHandleServiceStatusChangedL:aServiceStatus.Error()=%d"),aServiceStatus.Error());
+ if (aType == ECCHPresenceSub)
+ {
+ /* SIP Adaptation -- sends error in Network Lost. This is added so that once we get it, we will unbindL and delete the context
+ * This happens only in case of SIP as it does not send the event in IM Subservice.
+ */
+ if (aServiceStatus.Error() && ECCHDisabled != aServiceStatus.State())
+ {
+ iEngine.ReleaseConnectionL ();
+ iEngine.DeleteContextL ();
+ }
+ }
+ else if (aType == ECCHIMSub)
+ {
+ MIMCVEngineCCHObserver::TServiceState notifyEvent =
+ MIMCVEngineCCHObserver::ENotLoggedIn;
+ switch (aServiceStatus.State())
+ {
+ case ECCHUninitialized:
+ {
+ //Nothing to be done
+ break;
+ }
+ case ECCHDisabled:
+ {
+ IM_CV_LOGS(TXT("CVEngineCCHHnadler::DoHandleServiceStatusChangedL DISABLED"));
+ if(iPrevNwError != KCCHErrorNetworkLost)
+ {
+ iEngine.CloseAllOpenChatsL ();
+ }
+ iEngine.ReleaseConnectionL();
+ iEngine.DeleteContextL ();
+ break;
+ }
+ case ECCHConnecting:
+ {
+ IM_CV_LOGS(TXT("CVEngineCCHHnadler::DoHandleServiceStatusChangedL ECCHConnecting") );
+ iPrevNwError = aServiceStatus.Error();
+ notifyEvent = MIMCVEngineCCHObserver::EConnecting;
+ break;
+ }
+ case ECCHEnabled:
+ {
+ IM_CV_LOGS(TXT("CVEngineCCHHnadler::DoHandleServiceStatusChangedL ECCHEnabled") );
+ notifyEvent = MIMCVEngineCCHObserver::ELogin;
+ iEngine.CreateContextL();
+ break;
+ }
+ case ECCHDisconnecting:
+ {
+ // If NetworkErrorLost error is received by CCH on this state, then do not close all chats
+ // as user would loose all the on-going conversation when the network connection is
+ // restored.
+ IM_CV_LOGS(TXT("CVEngineCCHHnadler::DoHandleServiceStatusChangedL ECCHDisconnecting") );
+// if (aServiceStatus.Error () != KCCHErrorNetworkLost )
+// {
+// iEngine.CloseAllOpenChatsL();
+// iEngine.ReleaseConnectionL ();
+// iEngine.DeleteContextL ();
+// }
+ notifyEvent = MIMCVEngineCCHObserver::EDisconnecting;
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+
+ if (iObserver)
+ {
+ iObserver->ServiceStatusChanged( aServiceId,
+ notifyEvent );
+
+ }
+
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CIMCVEngineCchHandler::RegisterObserver
+// ---------------------------------------------------------------------------
+//
+void CIMCVEngineCchHandler::RegisterObserver(MIMCVEngineCCHObserver* aObserver)
+ {
+ if (aObserver)
+ {
+ iObserver = aObserver;
+ }
+ }
+
+
+
+// ---------------------------------------------------------------------------
+// CIMCVEngineCchHandler::UnRegisterObserver
+// ---------------------------------------------------------------------------
+//
+void CIMCVEngineCchHandler::UnRegisterObserver()
+ {
+ iObserver = NULL;
+ }
+
+
+// End of file
+