--- a/networkcontrol/ipscpr/src/deft_scpr.cpp Tue Aug 31 16:45:15 2010 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,460 +0,0 @@
-// Copyright (c) 2004-2009 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:
-// Implementation file for the IP SubConnection Provider
-//
-//
-
-/**
- @file
-*/
-
-#include <e32std.h>
-#include <e32test.h>
-#include <ss_glob.h>
-#include "deft_scpr.h"
-#include "ipscprlog.h"
-#ifdef SYMBIAN_NETWORKING_UMTSR5
-#include "MAppIdInfo.h"
-#include <networking/qos3gpp_subconparams.h>
-#include <ip_subconparams.h>
-#endif //SYMBIAN_NETWORKING_UMTSR5
-
-#ifdef SYMBIAN_NETWORKING_UMTSR5
- const TUint32 KSIPSecureId = 270490934;
- const TUint32 KDHCPSecureId = 270522821;
- const TUint32 KDNSSecureId = 268437634;
-#endif //SYMBIAN_NETWORKING_UMTSR5
-
-CEmptySubConnectionProvider::~CEmptySubConnectionProvider()
- {
- __IPCPRLOG(IpCprLog::Printf(_L("~CEmptySubConnectionProvider [this=%08x]"), this));
- if (iConnectionProvider)
- {
- iConnectionProvider->Leave(*this);
- }
- }
-
-void CEmptySubConnectionProvider::DoControlClientJoiningL(MSubConnectionControlClient& aControlClient)
- {
- (void)aControlClient;
- __IPCPRLOG(IpCprLog::Printf(_L("CEmptySubConnectionProvider [this=%08x]:\tDoControlClientJoiningL() [iControlClients.Count=%d] [aControlClient=%08x]"), this, iControlClients.Count(), &aControlClient));
- }
-
-void CEmptySubConnectionProvider::DoControlClientLeaving(MSubConnectionControlClient& aControlClient)
- {
- (void)aControlClient;
- __IPCPRLOG(IpCprLog::Printf(_L("CEmptySubConnectionProvider [this=%08x]:\tDoControlClientLeaving() [iControlClients.Count=%d] [aControlClient=%08x]"), this, iControlClients.Count(), &aControlClient));
- }
-
-void CEmptySubConnectionProvider::EnumerateClientsL(TUint& aCount, TDes8& aDes, CConnectionProviderBase::TEnumClients aClientType)
- {
- STypeId tid = STypeId::CreateSTypeId(KConnectionClientExtUid,EConnectionClientDesc);
- TInt max = iControlClients.Count();
- for ( TInt n = 0; n < max; n++ )
- {
- MConnectionClientDesc* intf = reinterpret_cast<MConnectionClientDesc*>(iControlClients[n]->FetchInterfaceInstanceL(*this,tid));
- if ( intf )
- {
- TConnectionProcessInfo cinfo;
- cinfo.GetInfoL(aClientType,aCount, *intf, aDes);
- }
- }
- STypeId tid2 = STypeId::CreateSTypeId(KConnectionClientExtUid,EConnectionEnumerateClients);
- max = iDataClients.Count();
- for ( TInt n = 0; n < max; n++ )
- {
- MConnectionEnumerateClients* intf = reinterpret_cast<MConnectionEnumerateClients*>(iDataClients[n]->FetchInterfaceInstanceL(*this,tid2));
- if ( intf )
- {
- intf->EnumerateClientsL(aCount,aDes,aClientType);
- }
- }
- }
-
-void CEmptySubConnectionProvider::ConnectionError(TInt /*aStage*/, TInt aError)
- {//it's comming from connection at the same level so forward it sideways
- //with an origin EConnection
- TInt max = iDataClients.Count();
- for ( TInt n = max - 1; n >= 0; n-- )
- {
- iDataClients[n]->SubConnectionError(*this, MSubConnectionDataClient::EConnection, aError);
- }
- }
-
-MConnectionDataClient* CEmptySubConnectionProvider::DoSelfConnectionDataClient()
- {
- return this;
- }
-
-
-// Methods to be overriden be derived subconnection provider
-void CDefaultSubConnectionProvider::DoControlClientJoiningL(MSubConnectionControlClient& aControlClient)
- {
- (void)aControlClient;
- __IPCPRLOG(IpCprLog::Printf(_L("CDefaultSubConnectionProvider::DoControlClientJoiningL [this=%08x]"), this));
- if (NULL != NextLayer())
- {
- __IPCPRLOG(IpCprLog::Printf(_L("Lower subconnection provider for IP exists - joined with provider")));
- }
- else
- {
- __IPCPRLOG(IpCprLog::Printf(_L("Lower subconnection provider for IP doesn't exists - not joined")));
- }
-
- }
-
-void CDefaultSubConnectionProvider::DoDataClientJoiningL(MSubConnectionDataClient& aDataClient)
- {
-#ifdef SYMBIAN_NETWORKING_UMTSR5
- // This piece of code is being added as per the requirements of PREQ 635 of dedicated PDP signalling
- // context. When Primary PDP Context is created Network will return back the code saying whether it
- // accepts the request to be dedicated signalling context or not. If Network decided to allow for dedicated
- // signalling context then UmtsGprs SCPR add the information into the iParameterBundle of the UmtsGprsScpr
-
- // However, if the User doesnt do RSubConnection::SetParamter(EAttachDefault), which actually the user shouldn't do
- // then we have to Get the parameter from the Next Layer, which again might or might not be UmtsGprs SubConnection Provider.
- // Nevertheless if we call SetParameter() on iNextLayer then SetParameters across all the Layers below will get called, and
- // since I knew that if any of the layer below is UmtsGprsSCpr, it will update the IMCN Signalling flag in the
- // parameter Bundle which I will pass with the SetParameter()
-
- // We Initialize this variable everytime so that it can it can point to proper next layer
- // everytime. Just a safety measure because it will anyway be initialised by the code written
- // below
- iSubConNextLayer = NULL;
- if (NULL == iNextLayer)
- {
- // Find the Next Layer , otherwise iSubConNextLayer will be NULL by default.
- CConnectionProviderBase* lowerConnectionProvider = iConnectionProvider->NextLayer();
- if (lowerConnectionProvider)
- {
- TUint nextLayerFactoryId = lowerConnectionProvider->CanDoSubConnection(RSubConnection::EAttachToDefault);
- if (nextLayerFactoryId != 0)
- {
- TSockManData* sockManData = SockManGlobals::Get();
- CSubConnectionFactoryContainer* subConnectionFactories = sockManData->iSubConnectionFactories;
- XSubConnectionFactoryQuery query(lowerConnectionProvider, RSubConnection::EAttachToDefault);
- iSubConNextLayer = subConnectionFactories->FindOrCreateProviderL(nextLayerFactoryId, query);
- }
-
- }
- }
- else
- {
- // We have a NextLayer, Point iSubConNextLayer to the same
- iSubConNextLayer = iNextLayer;
- }
-
- // Get The parameter Bundle for this SubConnectionProvider Instance. if Not available create one
- // and Get the parameters from the Next Lyer
- CSubConParameterBundle *tempBundle = NULL;
- if (iSubConNextLayer != NULL)
- {
- tempBundle = iParameterBundle != NULL? iParameterBundle :CSubConParameterBundle::NewL();
- TRAP_IGNORE(iSubConNextLayer->SetParametersL(*tempBundle));
- }
-
- // Get the family if Available
- CSubConParameterFamily *imcnFamily = tempBundle != NULL ? tempBundle->FindFamily(KSubConnContextDescrParamsFamily) : NULL;
- if (imcnFamily)
- {
- // Find the family, Look for the IMCN value, using CSubConImsExtParamSet defined in Qos3gpp
- CSubConImsExtParamSet *imcnSigParams = static_cast<CSubConImsExtParamSet*>
- (imcnFamily->FindExtensionSet(STypeId::CreateSTypeId(KSubConIPParamsUid,KSubConImsExtParamsType),
- CSubConParameterFamily::EGranted));
- // If Family contains IMCN Signalling Parameters
- if (imcnSigParams&& imcnSigParams->GetImsSignallingIndicator())
- {
- // Check and Delete
- if (tempBundle != iParameterBundle)
- {
- tempBundle->Close();
- tempBundle=NULL;
- }
- // Fetch the interface from the connection provider
- STypeId typeID = STypeId::CreateSTypeId(KConnectionAppInfoInterfaceId,0); // IP Conenction provider factory Uid
- TAny* intf = iConnectionProvider->FetchInterfaceInstanceL(typeID);
- if (!intf)
- {
- // We are not able to get the AppSId so leaving
- User::Leave(KErrNotSupported);
- }
- MConnectionAppIdInfo *appIdIP = static_cast<MConnectionAppIdInfo*>(intf);
- TUint32 appSecureId = appIdIP->GetAppSecureId();
-
- // if socket is being opened by any application other than SIP, DHCP, and DNS we need to
- // restrict the socket from being Created.
-
-
- if ( ( appSecureId==KSIPSecureId || iAppId == KSIPSecureId) ||
- (appSecureId==KDHCPSecureId || iAppId == KDHCPSecureId) ||
- (appSecureId==KDNSSecureId || iAppId == KDNSSecureId) )
- {
- aDataClient.JoinComplete(*this);
- }
- else
- {
- User::Leave(KErrPermissionDenied);
- }
- } // if (imcnSigParams&& imcnSigParams->GetImsSignallingIndicator())
- else
- {
- if (iConnectionProvider->IsLayerUp())
- {
- aDataClient.JoinComplete(*this);
- }
-
- }
- } // if (imcnFamily)
- // Check and Delete
- if (tempBundle != iParameterBundle && tempBundle!=NULL)
- {
- tempBundle->Close();
- }
-#else
-
- if (iConnectionProvider->IsLayerUp())
- {
- aDataClient.JoinComplete(*this);
- }
-#endif // #ifdef SYMBIAN_NETWORKING_UMTSR5
-
- }
-
-void CDefaultSubConnectionProvider::DoDataClientLeaving(MSubConnectionDataClient& aDataClient)
- {
- aDataClient.LeaveComplete(*this);
- }
-
-void CDefaultSubConnectionProvider::DoSourceAddressUpdate(MSubConnectionDataClient& /*aDataClient*/, const TSockAddr& /*aSource*/)
- {
- }
-
-void CDefaultSubConnectionProvider::DoDestinationAddressUpdate(MSubConnectionDataClient& /*aDataClient*/, const TSockAddr& /*aDestination*/)
- {
- }
-
-void CDefaultSubConnectionProvider::DoDataClientRouted(MSubConnectionDataClient& /*aDataClient*/, const TSockAddr& /*aSource*/, const TSockAddr& /*aDestination*/, const TDesC8& /*aConnectionInfo*/)
- {
- }
-
-#ifdef SYMBIAN_NETWORKING_3GPPDEFAULTQOS
-void CDefaultSubConnectionProvider::DoParametersAboutToBeSetL(CSubConParameterBundle& aParameterBundle)
- {
- __IPCPRLOG(IpCprLog::Printf(_L("CDefaultSubConnectionProvider::DoParametersAboutToBeSetL [this=%08x]"), this));
- if (NULL != NextLayer())
- {
- __IPCPRLOG(IpCprLog::Printf(_L("Lower subconnection provider for IP exists - forwarding the request")));
- iNextLayer->SetParametersL(aParameterBundle);
- }
- else
- {
- __IPCPRLOG(IpCprLog::Printf(_L("Lower subconnection provider for IP doesn't exists - the request not supported")));
- User::Leave(KErrNotSupported);
- }
- }
-
-#else
-void CDefaultSubConnectionProvider::DoParametersAboutToBeSetL(CSubConParameterBundle& /*)aParameterBundle*/)
- {//this could potentially fetch a current parameters from GuQoS and return them back as granted ones
- User::Leave(KErrNotSupported);
- }
-#endif
-
-#ifdef SYMBIAN_NETWORKING_UMTSR5
-TInt CDefaultSubConnectionProvider::DoControl(TUint aOptionLevel, TUint /*aOptionName*/, TDes8& /*aOption*/)
-#else
-TInt CDefaultSubConnectionProvider::DoControl(TUint /*aOptionLevel*/, TUint /*aOptionName*/, TDes8& /*aOption*/)
-#endif //#ifdef SYMBIAN_NETWORKING_UMTSR5
- {
-#ifdef SYMBIAN_NETWORKING_UMTSR5
-//This control is used to send application secure ID of Active Connection. This Id
-//will be used to for adding socket as data client to the subconnection.
- iAppId=aOptionLevel;
- return KErrNone;
-#else
- return KErrNotSupported;
-#endif //#ifdef SYMBIAN_NETWORKING_UMTSR5
- }
-
-void CDefaultSubConnectionProvider::DoStartL()
- {
- __IPCPRLOG(IpCprLog::Printf(_L("CDefaultSubConnectionProvider::DoStartL [this=%08x]"), this));
- }
-
-void CDefaultSubConnectionProvider::DoStop()
- {
- __IPCPRLOG(IpCprLog::Printf(_L("CDefaultSubConnectionProvider::DoStop [this=%08x]"), this));
-#ifdef SYMBIAN_NETWORKING_3GPPDEFAULTQOS
- if (iNextLayer)
- {
- __IPCPRLOG(IpCprLog::Printf(_L("Leaving Lower subconnection provider")));
- iNextLayer->Leave(*this);
- iNextLayer = NULL;
- }
-#endif
- }
-
-CSubConnectionProviderBase* CDefaultSubConnectionProvider::DoNextLayer()
- {
-#ifdef SYMBIAN_NETWORKING_3GPPDEFAULTQOS
- __IPCPRLOG(IpCprLog::Printf(_L("CDefaultSubConnectionProvider [this=%08x]:\tDoNextLayer()"), this));
- if (NULL == iNextLayer)
- {
- CConnectionProviderBase* lowerConnectionProvider = iConnectionProvider->NextLayer();
- if (!lowerConnectionProvider)
- {
- //This could denote the connection isn't started and perhaps should be from here,
- // but since the selection isn't separated from startup, we don't have enough
- // information to do it here.
- __IPCPRLOG(IpCprLog::Printf(_L("CDefaultSubConnectionProvider [this=%08x]:\tDoNextLayer() Connection Provider is missing its NextLayer"), this));
- return NULL; // No Lower layer,so leaving rhostresolver without connection.
- }
-
- TUint nextLayerFactoryId = lowerConnectionProvider->CanDoSubConnection(RSubConnection::EAttachToDefault);
- TRAP_IGNORE(
-
- if (nextLayerFactoryId != 0)
- {
- //'This' not started yet. The lower layer unknown
- //This is as much as we can delay with resolving the subconnection stack
- TSockManData* sockManData = SockManGlobals::Get();
- CSubConnectionFactoryContainer* subConnectionFactories = sockManData->iSubConnectionFactories;
-
- XSubConnectionFactoryQuery query(lowerConnectionProvider, RSubConnection::EAttachToDefault);
- iNextLayer = subConnectionFactories->FindOrCreateProviderL(nextLayerFactoryId, query);
- }
-
- if (iNextLayer)
- {
- __IPCPRLOG(IpCprLog::Printf(_L("Lower subconnection provider for IP found.. Joining")));
- iNextLayer->JoinL(*this);
- }
- else
- {
- __IPCPRLOG(IpCprLog::Printf(_L("Lower subconnection provider for IP not found.. Continuing")));
- }
- );
-
- }
-
- return iNextLayer;
-
-#else
- __IPCPRLOG(IpCprLog::Printf(_L("Lower subconnection provider for IP not supported")));
- return NULL;
-#endif
-//SYMBIAN_NETWORKING_3GPPDEFAULTQOS
- }
-
-CConnDataTransfer& CDefaultSubConnectionProvider::DoDataTransferL()
- {
- User::Leave(KErrNotSupported);
- //unreachable code
- return iNextLayer->DataTransferL();
- }
-
-//MConnectionDataClient
-TAny* CDefaultSubConnectionProvider::FetchInterfaceInstanceL(CConnectionProviderBase& /*aProvider*/, const STypeId& aTid)
- {
- return (aTid == STypeId::CreateSTypeId(KConnectionClientExtUid,EConnectionEnumerateClients)) ? static_cast<MConnectionEnumerateClients*>(this) : NULL;
- }
-
-void CDefaultSubConnectionProvider::ConnectionGoingDown(CConnectionProviderBase& /*aConnProvider*/)
- {
- __IPCPRLOG(IpCprLog::Printf(_L("CDefaultSubConnectionProvider [this=%08x]:\tConnectionGoingDown()"), this));
- iConnectionProvider = NULL;
- DeleteMeNow();
- }
-
-void CDefaultSubConnectionProvider::Notify(MConnectionDataClient::TNotify aNotifyType, CConnectionProviderBase* /*aConnProvider*/, TInt aError, const CConNotificationEvent* /*aConNotificationEvent*/)
- {
- int count = iControlClients.Count();
- for (int i = count - 1; i >= 0; --i)
- {
- iControlClients[i]->SubConnectionEvent(*this, aNotifyType, aError, NULL);
- }
- if (aNotifyType == ENotifyLayerUp)
- {//complete outstanding data client joins
- TInt max = iDataClients.Count();
- for ( TInt n = max - 1; n >= 0; n-- )
- {
- if (aError == KErrNone)
- {
- iDataClients[n]->JoinComplete(*this);
- }
- else
- {
- iDataClients[n]->JoinFailed(*this,aError);
- }
- }
- }
- }
-
-void CDefaultSubConnectionProvider::AttachToNext(CSubConnectionProviderBase* /*aSubConnProvider*/)
- {
- }
-
-CDefaultSubConnectionProvider::~CDefaultSubConnectionProvider ()
- {
- __IPCPRLOG(IpCprLog::Printf(_L("~CDefaultSubConnectionProvider [this=%08x]"), this));
-#ifdef SYMBIAN_NETWORKING_3GPPDEFAULTQOS
- if (iNextLayer)
- {
- iNextLayer->Leave (*this);
- }
-#endif
- }
-
-
-#ifdef SYMBIAN_NETWORKING_3GPPDEFAULTQOS
-void CDefaultSubConnectionProvider::DoControlClientLeaving(MSubConnectionControlClient& aControlClient)
- {
- (void)aControlClient;
- __IPCPRLOG(IpCprLog::Printf(_L("CDefaultSubConnectionProvider [this=%08x]:\tDoControlClientLeaving() [iControlClients.Count=%d] [aControlClient=%08x]"), this, iControlClients.Count(), &aControlClient));
-
- // Note: control client count == 1 because the the client has not been removed yet
- if (iNextLayer && iControlClients.Count() == 1 && iDataClients.Count() == 0)
- {
- iNextLayer->Leave (*this);
- iNextLayer = NULL;
- }
- }
-
-void CDefaultSubConnectionProvider::SubConnectionEvent(CSubConnectionProviderBase& /*aSubConnProvider*/, MConnectionDataClient::TNotify /*aNotifyType*/, TInt /*aError*/, const CSubConNotificationEvent* aEvent)
- {
- NotifyClientEvent(*aEvent);
- }
-
-
-void CDefaultSubConnectionProvider::SubConnectionGoingDown(CSubConnectionProviderBase& /*aSubConnProvider*/)
- {
- TInt max = iControlClients.Count();
- for ( TInt n = max - 1; n >= 0; n-- )
- {
- iControlClients[n]->SubConnectionGoingDown(*this);
- }
- }
-
-
-void CDefaultSubConnectionProvider::LayerUp(CSubConnectionProviderBase& /*aSubConnProvider*/, TInt /*aError*/)
- {
- }
-
-void CDefaultSubConnectionProvider::IncomingConnection(CSubConnectionProviderBase* /*aSubConnProvider*/, CSubConParameterBundle* /*aParameterBundle*/, TInt /*aError*/)
- {
- }
-
-#endif
-// SYMBIAN_NETWORKING_3GPPDEFAULTQOS
-