presencefwsimpleadpt/src/simplepluginconnection.cpp
branchRCL_3
changeset 35 fbd2e7cec7ef
parent 0 c8caa15ef882
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/presencefwsimpleadpt/src/simplepluginconnection.cpp	Wed Sep 01 12:23:14 2010 +0100
@@ -0,0 +1,573 @@
+/*
+* 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:    SIMPLE Protocol implementation for Presence Framework
+*
+*/
+
+
+
+
+#include <e32std.h>
+
+#include <ximpstatus.h>
+#include <ximpserviceinfo.h>
+#include <ximpcontextclientinfo.h>
+#include <ximpprotocolconnectionhost.h>
+#include <ximpfeatureinfo.h>
+#include <ximpidentity.h>
+#include <ximperrors.hrh>
+#include <presenceerrors.hrh>
+
+#include <protocolpresencedatahost.h>
+
+#include "simplepluginconnection.h"
+#include "simplepluginsession.h"
+#include "simpleplugindebugutils.h"
+#include "simplepluginauthorization.h"
+#include "simplepluginwinfo.h"
+#include "simplepluginpublisher.h"
+#include "simplepluginwatcher.h"
+#include "simpleplugingroups.h"
+#include "simplepluginxdmutils.h"
+#include "simplepluginvariation.h"
+#include "msimplepluginconnectionobs.h"
+#include "msimplepluginsettings.h"
+#include "simpleerrors.h"
+
+class MXIMPObjectFactory;
+
+// ======== MEMBER FUNCTIONS ========
+
+
+// ---------------------------------------------------------------------------
+// CSimplePluginConnection::CSimplePluginConnection
+// ---------------------------------------------------------------------------
+//
+CSimplePluginConnection::CSimplePluginConnection()
+: iSipPresentity(NULL)
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginConnection::NewL
+// ---------------------------------------------------------------------------
+//
+CSimplePluginConnection* CSimplePluginConnection::NewL( 
+    const MXIMPServiceInfo& aServiceInfo,
+    const MXIMPContextClientInfo& aClientCtxInfo )
+    {
+    CSimplePluginConnection* self = new( ELeave ) CSimplePluginConnection(  );
+    CleanupStack::PushL( self );
+    self->ConstructL( aServiceInfo, aClientCtxInfo );
+    CleanupStack::Pop( self );    
+    return self;
+    }
+    
+// ---------------------------------------------------------------------------
+// CSimplePluginConnection::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginConnection::ConstructL( 
+    const MXIMPServiceInfo& aServiceInfo,
+    const MXIMPContextClientInfo& /* aClientCtxInfo */ )
+    {                  
+    iSession = CSimplePluginSession::NewL( aServiceInfo, *this ); 
+   
+    iAuth = CSimplePluginAuthorization::NewL( *this );   
+        
+    iPublisher = CSimplePluginPublisher::NewL(
+        *this, *this,        
+        *iSession->SimpleConnection() ); 
+        
+    iWatcher = CSimplePluginWatcher::NewL(
+        *this, *this,
+        *iSession->SimpleConnection() ); 
+        
+    iGroups = CSimplePluginGroups::NewL( 
+        *this );
+    
+    iPluginWinfo = CSimplePluginWinfo::NewL( 
+        *this, *(iSession->SimpleConnection()));  
+        
+    iVariation = CSimplePluginVariation::NewL();    
+    iVariation->InitL();      
+    }    
+
+// ---------------------------------------------------------------------------
+// CSimplePluginConnection::~CSimplePluginConnection
+// ---------------------------------------------------------------------------
+//
+CSimplePluginConnection::~CSimplePluginConnection()
+    {     
+    
+    delete iSipPresentity;
+    
+    delete iVariation;                   
+    delete iPluginWinfo;    
+    delete iWatcher;
+    delete iPublisher;
+    delete iAuth;   
+    delete iGroups; 
+    delete iSession;       
+    
+    delete iXdmUtils;    
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginConnection::PrimeHost
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginConnection::PrimeHost( MXIMPProtocolConnectionHost& aHost )
+    {
+    iConnectionHost = &aHost;
+    iAuth->SetDataHost( iConnectionHost->ProtocolPresenceDataHost().AuthorizationDataHost() );
+    }
+    
+    
+// ---------------------------------------------------------------------------
+// CSimplePluginConnection::ProtocolPresenceFeatures
+// ---------------------------------------------------------------------------
+//  
+MProtocolPresenceFeatures& CSimplePluginConnection::ProtocolPresenceFeatures()
+    {
+    return *this;
+    }
+    
+/*<branchInfo originator="gronoff" since="08-06-06" category="new_feature" error=”none”>
+<pf_5250_OFF_CYCLE_SW_INT>
+</branchInfo>*/
+// BRANCH 08-06-17 : gronoff
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::GetProtocolInterface()
+// ---------------------------------------------------------------------------
+// 
+TAny* CSimplePluginConnection::GetProtocolInterface( TInt /*aInterfaceId*/ )
+	{
+	return NULL;
+	}
+// BRANCH_END 08-06-17 : gronoff   
+
+// ---------------------------------------------------------------------------
+// CSimplePluginConnection::PresenceWatching
+// ---------------------------------------------------------------------------
+//
+MProtocolPresenceWatching& CSimplePluginConnection::PresenceWatching()
+    {   
+    return *iWatcher;
+    }
+// ---------------------------------------------------------------------------
+// CSimplePluginConnection::PresencePublishing
+// ---------------------------------------------------------------------------
+//
+MProtocolPresencePublishing& CSimplePluginConnection::PresencePublishing()
+    {
+    return *iPublisher;
+    }
+// ---------------------------------------------------------------------------
+// CSimplePluginConnection::PresentityGroups
+// ---------------------------------------------------------------------------
+//
+MProtocolPresentityGroups& CSimplePluginConnection::PresentityGroups()
+    {
+    return *iGroups;
+    }
+// ---------------------------------------------------------------------------
+// CSimplePluginConnection::PresenceAuthorization
+// ---------------------------------------------------------------------------
+//
+MProtocolPresenceAuthorization& CSimplePluginConnection::PresenceAuthorization()
+    {      
+    return *iAuth;
+    }
+    
+    
+// ---------------------------------------------------------------------------
+// CSimplePluginConnection::OpenSessionL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginConnection::OpenSessionL(
+    const TInt& aSettingsId,
+    TXIMPRequestId aReqId )
+    {
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginConnection: OpenSessionL"));
+#endif             
+    iPrFwId = aReqId;
+    TRAPD( err, iSession->OpenSessionL( aSettingsId )); 
+    if ( err )
+        {
+        User::Leave( CSimplePluginConnection::HarmonizeErrorCode( err ));
+        }     
+    }  
+
+// ---------------------------------------------------------------------------
+// CSimplePluginConnection::OpenSessionL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginConnection::OpenSessionL( 
+    const MXIMPContextClientInfo& /*aClientCtxInfo*/,
+    TXIMPRequestId /*aReqId*/ )
+    {   
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginConnection: OpenSessionL - error: not supported"));
+#endif    
+    User::Leave( KErrNotSupported );           
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginConnection::CloseSession
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginConnection::CloseSession( 
+    const MXIMPContextClientInfo& /*aClientCtxInfo*/,
+    TXIMPRequestId aReqId )
+    {
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginConnection: CloseSession"));
+#endif          
+    iPrFwId = aReqId;
+    
+    delete iPluginWinfo;
+    iPluginWinfo = NULL;    
+    delete iWatcher;
+    iWatcher = NULL;
+    delete iPublisher;
+    iPublisher = NULL;
+    delete iAuth;    
+    iAuth = NULL;
+    delete iSession;    
+    iSession = NULL;
+    delete iGroups;
+    iGroups = NULL; 
+    delete iXdmUtils;
+    iXdmUtils = NULL; 
+    
+    CompleteReq( iPrFwId, KErrNone );          
+    }
+// ---------------------------------------------------------------------------
+// CSimplePluginConnection::GetSupportedFeaturesL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginConnection::GetSupportedFeaturesL( CDesC8Array& aFeatures ) const
+    {
+    // first empty the whole array
+    aFeatures.Reset();   
+    using namespace NXIMPFeature::Presence;    
+    aFeatures.AppendL( KPublish );
+    aFeatures.AppendL( KFetch );    
+    aFeatures.AppendL( KSubscribe );    
+    aFeatures.AppendL( KUnsubscribe  );    
+    }
+    
+// ---------------------------------------------------------------------------
+// CSimplePluginConnection::CompleteReq
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginConnection::CompleteReq( TReqType aType, TInt aStatus )
+    {
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginConnection: CompleteReq stat=%d"), aStatus);
+#endif         
+
+    TInt retVal = HarmonizeErrorCode( aStatus );
+    
+    // Return immediately if PrimeHost() is not called. This is for testing purposes. 
+    if ( !iConnectionHost )
+        {
+        iPrFwId = TXIMPRequestId(); 
+        return;
+        }
+                      
+    switch ( aType )
+        {
+        case EOpenSess:
+#ifdef _DEBUG
+    PluginLogger::Log(
+        _L("PluginConnection: callback HandleRequestCompleted stat=%d"), retVal);
+    PluginLogger::Log(
+        _L("PluginConnection: ------------------------------------------------1"));        
+#endif          
+            iConnectionHost->HandleRequestCompleted( iPrFwId, retVal );
+            iPrFwId = TXIMPRequestId();             
+            break;
+        default: 
+            break;   
+        };
+    }
+        
+// ---------------------------------------------------------------------------
+// CSimplePluginConnection::CompleteReq
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginConnection::CompleteReq( TXIMPRequestId aReqId, TInt aStatus )
+    {    
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginConnection: CompleteReq stat=%d"), aStatus);
+#endif
+
+    TInt retVal = HarmonizeErrorCode( aStatus );
+                   
+    // Return immediately if PrimeHost() is not called. This is for testing purposes.
+    if ( !iConnectionHost )
+        {
+        return;
+        }  
+#ifdef _DEBUG
+    PluginLogger::Log(
+        _L("PluginConnection: callback HandleRequestCompleted stat=%d"), retVal);
+    PluginLogger::Log(
+        _L("PluginConnection: ------------------------------------------------2"));        
+#endif              
+    iConnectionHost->HandleRequestCompleted( aReqId, retVal );
+    } 
+    
+// ---------------------------------------------------------------------------
+// CSimplePluginConnection::CompleteWinfoReq
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginConnection::CompleteWinfoReq( TXIMPRequestId aReqId, TInt aStatus )
+    {    
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginConnection: CompleteWinfoReq stat=%d"), aStatus);
+#endif
+
+    if ( iAuth && iAuth->HandleIfMine( aReqId, aStatus ))
+        {
+        // Nothing to do, the request in not complete yet
+#ifdef _DEBUG
+        PluginLogger::Log(_L("PluginConnection: CompleteWinfoReq waits ***"), aStatus);
+#endif         
+        }
+    else
+        {
+#ifdef _DEBUG
+        PluginLogger::Log(_L("PluginConnection: CompleteWinfoReq completes ***"), aStatus);
+#endif        
+        CompleteReq( aReqId, aStatus );
+        }
+    }                  
+     
+// ---------------------------------------------------------------------------
+// CSimplePluginConnection::ObjectFactory
+// ---------------------------------------------------------------------------
+// 
+MXIMPObjectFactory& CSimplePluginConnection::ObjectFactory()
+    {
+    return iConnectionHost->ObjectFactory();
+    }
+    
+// ---------------------------------------------------------------------------
+// CSimplePluginConnection::PresenceObjectFactory
+// ---------------------------------------------------------------------------
+// 
+MPresenceObjectFactory& CSimplePluginConnection::PresenceObjectFactory()
+    {
+    return iConnectionHost->ProtocolPresenceDataHost().PresenceObjectFactory();    
+    }     
+  
+// ---------------------------------------------------------------------------
+// CSimplePluginConnection::Host
+// ---------------------------------------------------------------------------
+//     
+MXIMPProtocolConnectionHost* CSimplePluginConnection::Host()
+    {
+    return iConnectionHost;
+    }
+    
+// ---------------------------------------------------------------------------
+// CSimplePluginConnection::CurrentDomain
+// ---------------------------------------------------------------------------
+//     
+TPtrC16 CSimplePluginConnection::CurrentDomain()
+    {
+    return iSession->CurrentDomain();    
+    } 
+    
+// ---------------------------------------------------------------------------
+// CSimplePluginConnection::Variation
+// ---------------------------------------------------------------------------
+//     
+CSimplePluginVariation& CSimplePluginConnection::Variation()
+    {
+    return *iVariation; 
+    }        
+           
+// ---------------------------------------------------------------------------
+// CSimplePluginConnection::CurrentSipPresentity
+// ---------------------------------------------------------------------------
+// 
+TPtrC16 CSimplePluginConnection::CurrentSipPresentity()
+    {       
+    delete iSipPresentity;
+    iSipPresentity = NULL;    
+    TRAPD( err, iSipPresentity = HBufC16::NewL( iSession->CurrentSipPresentity().Length() ));
+        
+    if ( !err )
+        {                
+        iSipPresentity->Des().Copy( iSession->CurrentSipPresentity() );
+        return iSipPresentity->Des();
+        }
+    else
+        {
+        return TPtrC16();
+        }        
+    }     
+    
+// ---------------------------------------------------------------------------
+// CSimplePluginConnection::CurrentSipPresentit8
+// ---------------------------------------------------------------------------
+// 
+TPtrC8 CSimplePluginConnection::CurrentSipPresentity8()
+    {
+    return iSession->CurrentSipPresentity();
+    } 
+            
+// ---------------------------------------------------------------------------
+// CSimplePluginConnection::XdmUtilsL
+// ---------------------------------------------------------------------------
+//
+CSimplePluginXdmUtils* CSimplePluginConnection::XdmUtilsL()
+    {
+    if ( !iXdmUtils )
+        {                
+        iXdmUtils = CSimplePluginXdmUtils::NewL( 
+            *this, iSession->XdmSettingsId() );
+        }
+    return iXdmUtils;
+    }
+            
+// ---------------------------------------------------------------------------
+// CSimplePluginConnection::WinfoHandlerL
+// ---------------------------------------------------------------------------
+//
+CSimplePluginWinfo* CSimplePluginConnection::WinfoHandlerL()
+    {
+    if ( !iPluginWinfo )
+        {
+        iPluginWinfo = CSimplePluginWinfo::NewL( 
+            *this, *(iSession->SimpleConnection() ));
+        }
+    iPluginWinfo->SetHost( iConnectionHost );
+    return iPluginWinfo;
+    }
+    
+// ---------------------------------------------------------------------------
+// CSimplePluginConnection::WinfoTerminatedL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginConnection::WinfoTerminatedL( TInt aReason )
+    {
+    // Pass the information to iAuth and iPublisher,
+    // so that they can call PrFw Plugin Data Host callbacks.
+    iAuth->WinfoTerminatedL( aReason );
+    iPublisher->WinfoTerminatedL( aReason );
+    }  
+    
+// ---------------------------------------------------------------------------
+// CSimplePluginConnection::WinfoNotification
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginConnection::WinfoNotification( MSimpleWinfo& aWinfo )
+    {
+    TRAP_IGNORE( iPublisher->WinfoNotificationL( aWinfo ));    
+    TRAP_IGNORE( iAuth->WinfoNotificationL( aWinfo ));
+    }      
+            
+// ---------------------------------------------------------------------------
+// CSimplePluginConnection::GetInterface
+// ---------------------------------------------------------------------------
+//
+TAny* CSimplePluginConnection::GetInterface(
+        TInt32 aInterfaceId,
+        TIfGetOps aOptions )
+    {
+    if ( aInterfaceId == GetInterfaceId() )
+        {
+        // caller wants this interface
+        MXIMPProtocolConnection* myIf = this;
+        return myIf;
+        }
+    if( aOptions == MXIMPBase::EPanicIfUnknown )
+        {
+        User::Panic( _L("CSimplePlugin"), KErrExtensionNotSupported );
+        }  
+    return NULL;
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginConnection::GetInterface
+// ---------------------------------------------------------------------------
+//
+const TAny* CSimplePluginConnection::GetInterface(
+    TInt32 aInterfaceId,
+    TIfGetOps aOptions ) const
+    {
+    if ( aInterfaceId == GetInterfaceId() )
+        {
+        // caller wants this interface
+        const MXIMPProtocolConnection* myIf = this;
+        return myIf;
+        }
+    if( aOptions == MXIMPBase::EPanicIfUnknown )
+        {
+        User::Panic( _L("CSimplePlugin"), KErrExtensionNotSupported );
+        }  
+    return NULL;
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginConnection::GetInterfaceId
+// ---------------------------------------------------------------------------
+//
+TInt32 CSimplePluginConnection::GetInterfaceId() const
+    {
+    return MXIMPProtocolConnection::KInterfaceId;
+    }
+    
+// ---------------------------------------------------------------------------
+// CSimplePluginConnection::HarmonizeErrorCode
+// ---------------------------------------------------------------------------
+//
+TInt CSimplePluginConnection::HarmonizeErrorCode( TInt aStatus )
+    {    
+
+    TInt retVal = aStatus;
+
+    // Convert error codes outsise e32err.h error range into PrFw errors.
+
+    switch ( aStatus )
+        {
+        case KSimpleErrAuthorization:
+            retVal = KPresenceErrNotEnoughCredits;
+            break;
+        case KSimpleErrTimeout:
+        case KErrTimedOut:
+            retVal = KXIMPErrServicRequestTimeouted;
+            break;            
+        default:
+            {
+            if ( aStatus < KSimplePluginGeneralErrorLow )
+                {
+                retVal = KXIMPErrServiceGeneralError;
+                }
+            }
+            break;                                
+        };
+        
+    return retVal;    
+    }
+
+
+// End of file
+