diff -r 000000000000 -r c8caa15ef882 simpledatamodeladapter/src/presencepluginsession.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/src/presencepluginsession.cpp Tue Feb 02 01:05:17 2010 +0200 @@ -0,0 +1,498 @@ +/* +* Copyright (c) 2006 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#include +#include //For MXIMPServiceInfo +#include //Handle command +#include //Connection callback methods +#include //create instances to abstract class +#include //Part of Registration API from SIMPLE engine +#include +#include //for TPresSettingsSet +#include +#include +#include +#include +#include + +#include "presencepluginxdmutils.h" +#include "presencepluginsession.h" +#include "mpresencepluginconnectionobs.h" +#include "presencepluginauthorization.h" +#include "presenceplugindata.h" + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CPresencePluginSession::CPresencePluginSession() +// --------------------------------------------------------------------------- +// +CPresencePluginSession::CPresencePluginSession( + MPresencePluginConnectionObs& aObs ) + : CActive( CActive::EPriorityStandard ),iObs(aObs), + iType( MPresencePluginConnectionObs::ENoReq ),iSipConnected( EFalse ), + iXdmConnected( EFalse ), iXdmLocalMode( EFalse ), iOperation( ENoOperation ), + iServiceId( KErrNotFound ) + { + CActiveScheduler::Add(this); + } + +// --------------------------------------------------------------------------- +// CPresencePluginSession::ConstructL() +// --------------------------------------------------------------------------- +// +void CPresencePluginSession::ConstructL( const MXIMPServiceInfo& aService ) + { + DP_SDA2("CPresencePluginSession::ConstructL: service id: %d", + aService.IapId() ); + + CSPSettings* spSettings = CSPSettings::NewL(); + CleanupStack::PushL( spSettings ); + + CSPProperty* property = CSPProperty::NewLC(); + spSettings->FindPropertyL( aService.IapId(), + ESubPropertyPresenceSettingsId, + *property ); + if ( property ) + { + property->GetValue( iPresSettingId ); + } + + CleanupStack::PopAndDestroy( property ); + CleanupStack::PopAndDestroy( spSettings ); + + DP_SDA2("PluginSession::ConstructL iPresSettingId %d",iPresSettingId ); + __ASSERT_ALWAYS( iPresSettingId > 0, User::Leave( KErrArgument ) ); + iServiceId = aService.IapId(); + + //Create connection + iConnection = TSimpleFactory::NewConnectionL( *this, aService.IapId() ); + + //Check here is xdm settings ok + CheckXDMSettingsL( aService.IapId() ); + + DP_SDA("CPresencePluginSession::ConstructL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginSession::NewL() +// --------------------------------------------------------------------------- +// +CPresencePluginSession* CPresencePluginSession::NewL( + const MXIMPServiceInfo& aService, + MPresencePluginConnectionObs& aObs ) + { + DP_SDA("CPresencePluginSession::NewL"); + CPresencePluginSession* self = + new( ELeave ) CPresencePluginSession( aObs ); + CleanupStack::PushL( self ); + self->ConstructL( aService ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CPresencePluginSession::~CPresencePluginSession() +// --------------------------------------------------------------------------- +// +CPresencePluginSession::~CPresencePluginSession() + { + DP_SDA("CPresencePluginSession::~CPresencePluginSession"); + + delete iUserId8; + delete iDomain; + if ( iConnection ) + { + iConnection->Close(); + } + + DP_SDA("~CPresencePluginSession iXdmUtils"); + delete iXdmUtils; + iXdmUtils = NULL; + DP_SDA("CPresencePluginSession::~CPresencePluginSession end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginSession::SimpleConnection() +// --------------------------------------------------------------------------- +// +TInt32 CPresencePluginSession::GetPresenceSetId( ) const + { + return iPresSettingId; + } + +// --------------------------------------------------------------------------- +// CPresencePluginSession::SimpleConnection() +// --------------------------------------------------------------------------- +// +MSimpleConnection* CPresencePluginSession::SimpleConnection( ) + { + return iConnection; + } + +// --------------------------------------------------------------------------- +// CPresencePluginSession::XdmSettingsId() +// --------------------------------------------------------------------------- +// +TInt CPresencePluginSession::XdmSettingsId( ) + { + DP_SDA("CPresencePluginSession::XdmSettingsId"); + return iXdmSetting; + } + +// --------------------------------------------------------------------------- +// CPresencePluginSession::CurrentDomain() +// --------------------------------------------------------------------------- +// +TPtrC16 CPresencePluginSession::CurrentDomain( ) + { + return iDomain ? iDomain->Des() : TPtrC16(); + } + +// --------------------------------------------------------------------------- +// CPresencePluginSession::IsXdmLocalmode() +// --------------------------------------------------------------------------- +// +TBool CPresencePluginSession::IsXdmLocalmode() + { + DP_SDA("CPresencePluginSession::IsXdmLocalmode"); + return iXdmLocalMode; + } +// --------------------------------------------------------------------------- +// CPresencePluginSession::OpenSessionL() +// --------------------------------------------------------------------------- +// +void CPresencePluginSession::OpenSessionL() + { + DP_SDA("CPresencePluginSession::OpenSessionL"); + //Check connection status + MSimpleConnection::TSimpleState connectionStatus = + iConnection->ConnectionStatus(); + DP_SDA2("OpenSessionL Connection Status %d", connectionStatus); + + if( connectionStatus == MSimpleConnection::EInactive ) + { + DP_SDA("CPresencePluginSession::OpenSessionL Not connected yet"); + iSipConnected = EFalse; + // SIP register using by give presence setting id + iOpId = iConnection->LoginL( iPresSettingId ); + iType = MPresencePluginConnectionObs::EOpenSess; + } + else if ( connectionStatus == MSimpleConnection::EActive ) + { + DP_SDA(":OpenSessionL already connected complete"); + iSipConnected = ETrue; + iType = MPresencePluginConnectionObs::EOpenSess; + RequestCompleteL( iOpId, KErrNone ); + } + } + +// --------------------------------------------------------------------------- +// CPresencePluginSession::ConnectionStatusL() +// --------------------------------------------------------------------------- +// +void CPresencePluginSession::ConnectionStatusL( + MSimpleConnection::TSimpleState aState ) + { + DP_SDA2("CPresencePluginSession::ConnectionStatusL aState %d", aState ); + + if ( (aState == MSimpleConnection::EInactive ) + && iSipConnected ) + { + DP_SDA("CPresencePluginSession::ConnectionStatusL EInactive"); + + DP_SDA("CPresencePluginSession::ConnectionStatusL clear pres cache"); + iObs.InternalPresenceAuthorization().PluginData().RemoveCacheL(); + DP_SDA("CPresencePluginSession::ConnectionStatusL clear cache ok"); + + // cancel all XDM request + iObs.XdmUtilsL()->Cancel(); + //Set connection Terminated, terminate will be remove all client binds + iObs.TerminateConnectionL(); + iSipConnected = EFalse; + iXdmConnected = EFalse; + } + else if( ( aState == MSimpleConnection::EUnavailable && iSipConnected ) ) + { + //Its seems that SIP connection is unavaible + DP_SDA("CPresencePluginSession::ConnectionStatusL EUnavailable"); + } + + } + +// --------------------------------------------------------------------------- +// CPresencePluginSession::CloseConnection() +// --------------------------------------------------------------------------- +// +void CPresencePluginSession::CloseConnection() + { + DP_SDA("CPresencePluginSession::CloseConnection"); + if( iConnection ) + { + DP_SDA("CPresencePluginSession::CloseConnection close called"); + iConnection->Close(); + iConnection = NULL; + } + DP_SDA("CPresencePluginSession::CloseConnection end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginSession::ConnectionStatus() +// --------------------------------------------------------------------------- +// +TBool CPresencePluginSession::ConnectionStatus() + { + DP_SDA("CPresencePluginSession::ConnectionStatus"); + TBool connection = EFalse; + if( iXdmConnected && iSipConnected ) + { + connection = ETrue; + } + return connection; + } + +// --------------------------------------------------------------------------- +// CPresencePluginSession::RequestCompleteL() +// --------------------------------------------------------------------------- +// +void CPresencePluginSession::RequestCompleteL( TInt /*aOpId*/, TInt aStatus ) + { + DP_SDA("CPresencePluginSession::RequestCompleteL"); + MPresencePluginConnectionObs::TReqType current = iType; + + if ( !aStatus ) + { + DP_SDA("CPresencePluginSession::RequestCompleteL SIP session is open"); + iSipConnected = ETrue; + if( iXdmConnected ) + { + DP_SDA("CPresencePluginSession::RequestCompleteL xdm IS OK"); + iType = MPresencePluginConnectionObs::ENoReq; + iObs.CompleteReq( current, aStatus ); + } + else + { + DP_SDA("CPresencePluginSession::RequestCompleteL Initialize XDM"); + __ASSERT_DEBUG( !IsActive(), User::Leave( KErrNotReady ) ); + //Lets test XDM connection before complete + iXdmUtils = CPresencePluginXdmUtils::NewL( + iObs, iXdmSetting, iXdmLocalMode ); + + iOperation = EInitializeXdm; + iXdmUtils->InitializeXdmL( iStatus ); + SetActive(); + } + + } + DP_SDA("CPresencePluginSession::RequestCompleteL END"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginSession::CurrentSipPresentity() +// --------------------------------------------------------------------------- +// +TPtrC8 CPresencePluginSession::CurrentSipPresentity() + { + DP_SDA("CPresencePluginSession::CurrentSipPresentity"); + // Get from Simple engine + delete iUserId8; + iUserId8 = NULL; + TRAPD(err, iUserId8 = iConnection->CurrentSIPIdentityL().AllocL() ) + if ( err == KErrNone ) + { + return iUserId8 ? iUserId8->Des() : TPtrC8(); + } + else + { + return iUserId8 ? KNullDesC8() : TPtrC8(); + } + } + +// --------------------------------------------------------------------------- +// CPresencePluginSession::CheckXDMSettings() +// --------------------------------------------------------------------------- +// +void CPresencePluginSession::CheckXDMSettingsL( TUint aServiceId ) + { + //Check if xdm settings not valid or there is text http://localhost + //in settings. If not valid or text found client will be save resourcelist + //to in phonememory + + TPresSettingsSet mySet; + User::LeaveIfError( + PresSettingsApi::SettingsSetL( iPresSettingId, mySet )); + iXdmSetting = mySet.iXDMSetting; + if( iDomain ) + { + delete iDomain; + iDomain = NULL; + } + iDomain = mySet.iDomainSyntax.AllocL(); + + DP_SDA(" -> CheckXDMSettings - store domain to service table"); + // Service table + CSPSettings* spsettings = CSPSettings::NewLC(); + CSPProperty* property = CSPProperty::NewLC(); + + DP_SDA(" -> CheckXDMSettings - spsettings and property created"); + User::LeaveIfError( property->SetName( ESubPropertyPresenceAddrScheme ) ); + DP_SDA(" -> CheckXDMSettings - property name set"); + + TInt atPosInDomain = iDomain->Locate( '@' ); + DP_SDA2(" -> CheckXDMSettings - @ position in domain: %d", atPosInDomain ); + if ( KErrNotFound == atPosInDomain ) + { + DP_SDA(" -> CheckXDMSettings - no @ in domain, set"); + property->SetValue( iDomain->Des() ); + } + else + { + DP_SDA(" -> CheckXDMSettings - @ found in domain, remove"); + HBufC* formattedDomain = HBufC::NewLC( iDomain->Length() ); + TPtr formattedDomainPtr( formattedDomain->Des() ); + formattedDomainPtr.Copy( iDomain->Mid( ( atPosInDomain + 1 ) ) ); + property->SetValue( formattedDomainPtr ); + CleanupStack::PopAndDestroy( formattedDomain ); + } + DP_SDA(" -> CheckXDMSettings - property value set"); + User::LeaveIfError( + spsettings->AddOrUpdatePropertyL( aServiceId, *property ) ); + DP_SDA(" -> CheckXDMSettings - property added or updated"); + + CleanupStack::PopAndDestroy( property ); + CleanupStack::PopAndDestroy( spsettings ); + +#ifdef _DEBUG + DP_SDA2("XdmSettingsId xdmSetting id %d",iXdmSetting ); + DP_SDA2("CheckXDMSettings::XdmSettingsId domain %S",iDomain ); +#endif + + //Continue check, add localhost to buf2 + HBufC* buf2 = KLocalhost().AllocLC(); + + //Get Uri from XDM settings + HBufC* xcaproot = NULL; + + TRAPD( error, xcaproot = + TXdmSettingsApi::PropertyL( iXdmSetting, EXdmPropUri ) ); + DP_SDA2("CheckXDMSettings Set localmode, err %d", error); + + if( KErrNotFound != error && xcaproot ) + { + //Compare buf2 to xcaproot + if ( !xcaproot->Compare( buf2->Des() ) ) + { + DP_SDA("CheckXDMSettings Set localmode"); + iXdmLocalMode = ETrue; + } + else + { + DP_SDA("CheckXDMSettings Set Normal Mode"); + iXdmLocalMode = EFalse; + } + + DP_SDA("CheckXDMSettings PopAndDestroy buf2"); + } + else + { + //It seems there is no valid XCAP settings, so we try localmode + //Shuld we create automaticaly XCAP localhost settings? + iXdmLocalMode = ETrue; + } + + DP_SDA("CheckXDMSettings PopAndDestroy xcaproot"); + CleanupStack::PopAndDestroy( buf2 ); + delete xcaproot; + } + +// --------------------------------------------------------------------------- +// CPresencePluginSession::XdmUtilsL() +// --------------------------------------------------------------------------- +// +CPresencePluginXdmUtils* CPresencePluginSession::XdmUtilsL() + { + if ( !iXdmUtils ) + { + DP_SDA("CPresencePluginSession::XdmUtilsL !iXdmUtils"); + iXdmUtils = CPresencePluginXdmUtils::NewL( + iObs, iXdmSetting, iXdmLocalMode ); + } + + return iXdmUtils; + } + +// --------------------------------------------------------------------------- +// CPresencePluginSession::ServiceId() +// --------------------------------------------------------------------------- +// +TInt& CPresencePluginSession::ServiceId() + { + return iServiceId; + } + +// --------------------------------------------------------------------------- +// CPresencePluginSession::DoCancel() +// --------------------------------------------------------------------------- +// +void CPresencePluginSession::DoCancel( ) + { + DP_SDA("CPresencePluginSession::DoCancel CANCEL"); + iXdmUtils->Cancel(); + } + +// --------------------------------------------------------------------------- +// CPresencePluginSession::RunL() +// --------------------------------------------------------------------------- +// +void CPresencePluginSession::RunL( ) + { + DP_SDA("CPresencePluginSession::RunL"); + TInt status = iStatus.Int(); + DP_SDA2("CPresencePluginSession::RunL status %d", status ); + + if( ( iOperation == EInitializeXdm ) && !status ) + { + DP_SDA("CPresencePluginSession::RequestCompleteL connection ready"); + iXdmConnected = ETrue; + MPresencePluginConnectionObs::TReqType current = iType; + iType = MPresencePluginConnectionObs::ENoReq; + iObs.CompleteReq( current, status ); + } + else + { + DP_SDA("Connection FAIL terminated"); + iXdmConnected = EFalse; + iSipConnected = EFalse; + iType = MPresencePluginConnectionObs::ECloseSess; + iObs.CompleteReq( iType, status ); + } + + } + +// --------------------------------------------------------------------------- +// CPresencePluginSession::RunError +// --------------------------------------------------------------------------- +// +TInt CPresencePluginSession::RunError( TInt /*aError*/ ) + { + DP_SDA("CPresencePluginSession::RunError"); + return KErrNone; + } + + // End of file +