networkcontrol/ipcpr/src/ipcprfactory.cpp
author hgs
Tue, 29 Jun 2010 19:20:22 +0530
changeset 37 052078dda061
permissions -rw-r--r--
201025_01
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
37
052078dda061 201025_01
hgs
parents:
diff changeset
     1
// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
052078dda061 201025_01
hgs
parents:
diff changeset
     2
// All rights reserved.
052078dda061 201025_01
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
052078dda061 201025_01
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
052078dda061 201025_01
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
052078dda061 201025_01
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
052078dda061 201025_01
hgs
parents:
diff changeset
     7
//
052078dda061 201025_01
hgs
parents:
diff changeset
     8
// Initial Contributors:
052078dda061 201025_01
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
052078dda061 201025_01
hgs
parents:
diff changeset
    10
//
052078dda061 201025_01
hgs
parents:
diff changeset
    11
// Contributors:
052078dda061 201025_01
hgs
parents:
diff changeset
    12
//
052078dda061 201025_01
hgs
parents:
diff changeset
    13
// Description:
052078dda061 201025_01
hgs
parents:
diff changeset
    14
// This is part of an ECOM plug-in
052078dda061 201025_01
hgs
parents:
diff changeset
    15
// 
052078dda061 201025_01
hgs
parents:
diff changeset
    16
//
052078dda061 201025_01
hgs
parents:
diff changeset
    17
052078dda061 201025_01
hgs
parents:
diff changeset
    18
#include <implementationproxy.h>
052078dda061 201025_01
hgs
parents:
diff changeset
    19
#include "ipcprfactory.h"	// CIPNetworkProviderFactory
052078dda061 201025_01
hgs
parents:
diff changeset
    20
#include "ipcprprovider.h"
052078dda061 201025_01
hgs
parents:
diff changeset
    21
#include <es_sock.h>        // KCommsNetworkLayerId
052078dda061 201025_01
hgs
parents:
diff changeset
    22
#include <ss_glob.h>
052078dda061 201025_01
hgs
parents:
diff changeset
    23
#include <shimcprfactory.h>
052078dda061 201025_01
hgs
parents:
diff changeset
    24
#include <esockmessages.h>
052078dda061 201025_01
hgs
parents:
diff changeset
    25
#include <commdbconnpref.h> // TConnPref
052078dda061 201025_01
hgs
parents:
diff changeset
    26
#include <commsdattypesv1_1.h> // CommsDat
052078dda061 201025_01
hgs
parents:
diff changeset
    27
#include <es_connpref.h>
052078dda061 201025_01
hgs
parents:
diff changeset
    28
#include <in_sock.h> //KAfInet
052078dda061 201025_01
hgs
parents:
diff changeset
    29
052078dda061 201025_01
hgs
parents:
diff changeset
    30
using namespace CommsDat;
052078dda061 201025_01
hgs
parents:
diff changeset
    31
using namespace ESock;
052078dda061 201025_01
hgs
parents:
diff changeset
    32
052078dda061 201025_01
hgs
parents:
diff changeset
    33
const TInt KIPConnectionProviderImplementationUid=0x102070EF;
052078dda061 201025_01
hgs
parents:
diff changeset
    34
052078dda061 201025_01
hgs
parents:
diff changeset
    35
/**
052078dda061 201025_01
hgs
parents:
diff changeset
    36
Data required for instantiating ECOM Plugin
052078dda061 201025_01
hgs
parents:
diff changeset
    37
*/
052078dda061 201025_01
hgs
parents:
diff changeset
    38
const TImplementationProxy ImplementationTable[] = 
052078dda061 201025_01
hgs
parents:
diff changeset
    39
	{
052078dda061 201025_01
hgs
parents:
diff changeset
    40
	IMPLEMENTATION_PROXY_ENTRY(KIPConnectionProviderImplementationUid, CIPNetworkProviderFactory::NewL)
052078dda061 201025_01
hgs
parents:
diff changeset
    41
	};
052078dda061 201025_01
hgs
parents:
diff changeset
    42
052078dda061 201025_01
hgs
parents:
diff changeset
    43
/**
052078dda061 201025_01
hgs
parents:
diff changeset
    44
ECOM Implementation Factory
052078dda061 201025_01
hgs
parents:
diff changeset
    45
*/
052078dda061 201025_01
hgs
parents:
diff changeset
    46
EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount)
052078dda061 201025_01
hgs
parents:
diff changeset
    47
    {
052078dda061 201025_01
hgs
parents:
diff changeset
    48
    aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);
052078dda061 201025_01
hgs
parents:
diff changeset
    49
    return ImplementationTable;
052078dda061 201025_01
hgs
parents:
diff changeset
    50
   }
052078dda061 201025_01
hgs
parents:
diff changeset
    51
052078dda061 201025_01
hgs
parents:
diff changeset
    52
CIPNetworkProviderFactory* CIPNetworkProviderFactory::NewL(TAny* aParentContainer)
052078dda061 201025_01
hgs
parents:
diff changeset
    53
	{
052078dda061 201025_01
hgs
parents:
diff changeset
    54
 	return new (ELeave) CIPNetworkProviderFactory(KIPConnectionProviderFactoryId, *(reinterpret_cast<CConnectionFactoryContainer*>(aParentContainer)));
052078dda061 201025_01
hgs
parents:
diff changeset
    55
	}
052078dda061 201025_01
hgs
parents:
diff changeset
    56
   
052078dda061 201025_01
hgs
parents:
diff changeset
    57
CIPNetworkProviderFactory::CIPNetworkProviderFactory(TUint aFactoryId, CConnectionFactoryContainer& aParentContainer)
052078dda061 201025_01
hgs
parents:
diff changeset
    58
	: CConnectionProviderFactoryBase(aFactoryId,aParentContainer)
052078dda061 201025_01
hgs
parents:
diff changeset
    59
	{
052078dda061 201025_01
hgs
parents:
diff changeset
    60
	}
052078dda061 201025_01
hgs
parents:
diff changeset
    61
   
052078dda061 201025_01
hgs
parents:
diff changeset
    62
CConnectionProviderBase* CIPNetworkProviderFactory::DoCreateProviderL()
052078dda061 201025_01
hgs
parents:
diff changeset
    63
	{
052078dda061 201025_01
hgs
parents:
diff changeset
    64
    return CIPNetworkConnectionProvider::NewL(*this);
052078dda061 201025_01
hgs
parents:
diff changeset
    65
	}
052078dda061 201025_01
hgs
parents:
diff changeset
    66
052078dda061 201025_01
hgs
parents:
diff changeset
    67
MProviderSelector* CIPNetworkProviderFactory::DoSelectProvider( Meta::SMetaData& aPreferences, ISelectionNotify& aSelectionNotify, const RMessagePtr2* aMessage )
052078dda061 201025_01
hgs
parents:
diff changeset
    68
	{
052078dda061 201025_01
hgs
parents:
diff changeset
    69
	//create self destructing object to select a provider
052078dda061 201025_01
hgs
parents:
diff changeset
    70
	CIPConnectionSelector* selector = new CIPConnectionSelector(aSelectionNotify,*this);
052078dda061 201025_01
hgs
parents:
diff changeset
    71
	TInt error;
052078dda061 201025_01
hgs
parents:
diff changeset
    72
	if (selector == 0)
052078dda061 201025_01
hgs
parents:
diff changeset
    73
		{
052078dda061 201025_01
hgs
parents:
diff changeset
    74
		error = KErrNoMemory;
052078dda061 201025_01
hgs
parents:
diff changeset
    75
		}
052078dda061 201025_01
hgs
parents:
diff changeset
    76
	else
052078dda061 201025_01
hgs
parents:
diff changeset
    77
		{
052078dda061 201025_01
hgs
parents:
diff changeset
    78
		error = selector->Select(aPreferences, aMessage);
052078dda061 201025_01
hgs
parents:
diff changeset
    79
		}
052078dda061 201025_01
hgs
parents:
diff changeset
    80
052078dda061 201025_01
hgs
parents:
diff changeset
    81
	if (error != KErrNone)
052078dda061 201025_01
hgs
parents:
diff changeset
    82
		{
052078dda061 201025_01
hgs
parents:
diff changeset
    83
		aSelectionNotify.SelectComplete(0, error);
052078dda061 201025_01
hgs
parents:
diff changeset
    84
		selector = NULL; //The selector will delete itself.
052078dda061 201025_01
hgs
parents:
diff changeset
    85
		}
052078dda061 201025_01
hgs
parents:
diff changeset
    86
052078dda061 201025_01
hgs
parents:
diff changeset
    87
 
052078dda061 201025_01
hgs
parents:
diff changeset
    88
	return selector;
052078dda061 201025_01
hgs
parents:
diff changeset
    89
  	}
052078dda061 201025_01
hgs
parents:
diff changeset
    90
052078dda061 201025_01
hgs
parents:
diff changeset
    91
MProviderSelector* CIPNetworkProviderFactory::DoSelectNextLayerProvider( Meta::SMetaData& aPreferences, ISelectionNotify& aSelectionNotify, const RMessagePtr2* /*aMessage*/ )
052078dda061 201025_01
hgs
parents:
diff changeset
    92
	{//at the moment always uses the CConnectionProviderFactoryShim::SelectProviderL
052078dda061 201025_01
hgs
parents:
diff changeset
    93
   (void)aPreferences;
052078dda061 201025_01
hgs
parents:
diff changeset
    94
   (void)aSelectionNotify;
052078dda061 201025_01
hgs
parents:
diff changeset
    95
   return NULL;
052078dda061 201025_01
hgs
parents:
diff changeset
    96
	}
052078dda061 201025_01
hgs
parents:
diff changeset
    97
	
052078dda061 201025_01
hgs
parents:
diff changeset
    98
void CIPNetworkProviderFactory::DoEnumerateConnectionsL(RPointerArray<TConnectionInfo>& aConnectionInfoPtrArray)
052078dda061 201025_01
hgs
parents:
diff changeset
    99
	{
052078dda061 201025_01
hgs
parents:
diff changeset
   100
	CConnectionFactoryContainer* connectionFactories = SockManGlobals::Get()->iConnectionFactories;
052078dda061 201025_01
hgs
parents:
diff changeset
   101
	ASSERT(connectionFactories);
052078dda061 201025_01
hgs
parents:
diff changeset
   102
	CConnectionProviderFactoryBase* factory = connectionFactories->FindFactory(KShimConnectionProviderFactoryId);
052078dda061 201025_01
hgs
parents:
diff changeset
   103
	ASSERT(factory);
052078dda061 201025_01
hgs
parents:
diff changeset
   104
	factory->EnumerateConnectionsL(aConnectionInfoPtrArray);
052078dda061 201025_01
hgs
parents:
diff changeset
   105
	}
052078dda061 201025_01
hgs
parents:
diff changeset
   106
052078dda061 201025_01
hgs
parents:
diff changeset
   107
052078dda061 201025_01
hgs
parents:
diff changeset
   108
//CIPConnectionSelector--
052078dda061 201025_01
hgs
parents:
diff changeset
   109
TInt CIPConnectionSelector::Cancel()
052078dda061 201025_01
hgs
parents:
diff changeset
   110
	{
052078dda061 201025_01
hgs
parents:
diff changeset
   111
	return Cancel(KErrCancel,NULL);
052078dda061 201025_01
hgs
parents:
diff changeset
   112
	}
052078dda061 201025_01
hgs
parents:
diff changeset
   113
052078dda061 201025_01
hgs
parents:
diff changeset
   114
TInt CIPConnectionSelector::Cancel(TInt aReason, const RMessage2* aMessage)
052078dda061 201025_01
hgs
parents:
diff changeset
   115
	{
052078dda061 201025_01
hgs
parents:
diff changeset
   116
	CActive::Cancel(); // There may be an outstanding selection request.
052078dda061 201025_01
hgs
parents:
diff changeset
   117
052078dda061 201025_01
hgs
parents:
diff changeset
   118
    //CIPConnectionSelector will be deleted from Detach().
052078dda061 201025_01
hgs
parents:
diff changeset
   119
    //Detach will always be called as a result of Cancel() in the same call stack,
052078dda061 201025_01
hgs
parents:
diff changeset
   120
    //but only after all progress notifications have been passed up towards the
052078dda061 201025_01
hgs
parents:
diff changeset
   121
    //CConnection.
052078dda061 201025_01
hgs
parents:
diff changeset
   122
    TInt ret = KErrNotReady;
052078dda061 201025_01
hgs
parents:
diff changeset
   123
    if(iNextLayerSelector !=NULL)
052078dda061 201025_01
hgs
parents:
diff changeset
   124
    	{
052078dda061 201025_01
hgs
parents:
diff changeset
   125
    	ret = iNextLayerSelector->Cancel(aReason, aMessage);
052078dda061 201025_01
hgs
parents:
diff changeset
   126
    	}
052078dda061 201025_01
hgs
parents:
diff changeset
   127
052078dda061 201025_01
hgs
parents:
diff changeset
   128
	iNotify.Detach(); //"PrevLayer"::Detach() will be called only once in the same call stack.
052078dda061 201025_01
hgs
parents:
diff changeset
   129
	return ret;
052078dda061 201025_01
hgs
parents:
diff changeset
   130
	}
052078dda061 201025_01
hgs
parents:
diff changeset
   131
052078dda061 201025_01
hgs
parents:
diff changeset
   132
TInt CIPConnectionSelector::Select(Meta::SMetaData& aPreferences, const RMessagePtr2* aMessage)
052078dda061 201025_01
hgs
parents:
diff changeset
   133
    {
052078dda061 201025_01
hgs
parents:
diff changeset
   134
	__FLOG_OPEN(KIpcprTag, KIpcprSubTag);
052078dda061 201025_01
hgs
parents:
diff changeset
   135
	__FLOG_1(_L8("CIPConnectionSelector::Select() %08x"), this);
052078dda061 201025_01
hgs
parents:
diff changeset
   136
052078dda061 201025_01
hgs
parents:
diff changeset
   137
	STypeId tId = STypeId::CreateSTypeId(aPreferences.GetTypeId());
052078dda061 201025_01
hgs
parents:
diff changeset
   138
    ASSERT(tId.iUid.iUid == KESockMessagesImplementationUid);
052078dda061 201025_01
hgs
parents:
diff changeset
   139
	ASSERT(tId.iType == EESockMessageConnStart);	
052078dda061 201025_01
hgs
parents:
diff changeset
   140
052078dda061 201025_01
hgs
parents:
diff changeset
   141
	if (aMessage)
052078dda061 201025_01
hgs
parents:
diff changeset
   142
		iSelectMessage = *aMessage; // aMessage will be passed on to shim
052078dda061 201025_01
hgs
parents:
diff changeset
   143
#ifdef SYMBIAN_NETWORKING_UMTSR5	
052078dda061 201025_01
hgs
parents:
diff changeset
   144
     //Here secure Id of application is stored and will be kept with  
052078dda061 201025_01
hgs
parents:
diff changeset
   145
    if(!iSelectMessage.IsNull())
052078dda061 201025_01
hgs
parents:
diff changeset
   146
     {
052078dda061 201025_01
hgs
parents:
diff changeset
   147
		iAppSecureId=iSelectMessage.SecureId();
052078dda061 201025_01
hgs
parents:
diff changeset
   148
     }
052078dda061 201025_01
hgs
parents:
diff changeset
   149
#endif // SYMBIAN_NETWORKING_UMTSR5	            
052078dda061 201025_01
hgs
parents:
diff changeset
   150
 
052078dda061 201025_01
hgs
parents:
diff changeset
   151
    TRAPD(r, SelectL(aPreferences));
052078dda061 201025_01
hgs
parents:
diff changeset
   152
	
052078dda061 201025_01
hgs
parents:
diff changeset
   153
	if (r!=KErrNone && iNextLayerSelector==NULL)
052078dda061 201025_01
hgs
parents:
diff changeset
   154
		{
052078dda061 201025_01
hgs
parents:
diff changeset
   155
		__FLOG_1(_L8("Error during selection of current  - should detech now %08x"), this);
052078dda061 201025_01
hgs
parents:
diff changeset
   156
 		Detach();
052078dda061 201025_01
hgs
parents:
diff changeset
   157
		return r;
052078dda061 201025_01
hgs
parents:
diff changeset
   158
 		}
052078dda061 201025_01
hgs
parents:
diff changeset
   159
 		
052078dda061 201025_01
hgs
parents:
diff changeset
   160
 	TRAP(r,SelectLinkLayerL());
052078dda061 201025_01
hgs
parents:
diff changeset
   161
 	if (r != KErrNone)
052078dda061 201025_01
hgs
parents:
diff changeset
   162
 		{
052078dda061 201025_01
hgs
parents:
diff changeset
   163
 		__FLOG_1(_L8("Error during select of link layer - detach should be called by the link layer %08x"), this);
052078dda061 201025_01
hgs
parents:
diff changeset
   164
 		}
052078dda061 201025_01
hgs
parents:
diff changeset
   165
	
052078dda061 201025_01
hgs
parents:
diff changeset
   166
	return r;
052078dda061 201025_01
hgs
parents:
diff changeset
   167
	}
052078dda061 201025_01
hgs
parents:
diff changeset
   168
052078dda061 201025_01
hgs
parents:
diff changeset
   169
void CIPConnectionSelector::SelectL(Meta::SMetaData& aPreferences)
052078dda061 201025_01
hgs
parents:
diff changeset
   170
	{
052078dda061 201025_01
hgs
parents:
diff changeset
   171
	ASSERT(iDbs==0);
052078dda061 201025_01
hgs
parents:
diff changeset
   172
#ifdef SYMBIAN_NON_SEAMLESS_NETWORK_BEARER_MOBILITY
052078dda061 201025_01
hgs
parents:
diff changeset
   173
	iDbs = CMDBSession::NewL(KCDVersion1_2);
052078dda061 201025_01
hgs
parents:
diff changeset
   174
#else
052078dda061 201025_01
hgs
parents:
diff changeset
   175
	iDbs = CMDBSession::NewL(KCDVersion1_1);
052078dda061 201025_01
hgs
parents:
diff changeset
   176
#endif
052078dda061 201025_01
hgs
parents:
diff changeset
   177
052078dda061 201025_01
hgs
parents:
diff changeset
   178
	// Reveal hidden or private IAP records if a licensee has chosen to protect a record
052078dda061 201025_01
hgs
parents:
diff changeset
   179
	// using one of these flags - the API to do this is public so internal components
052078dda061 201025_01
hgs
parents:
diff changeset
   180
	// have to support the use of such records.
052078dda061 201025_01
hgs
parents:
diff changeset
   181
	iDbs->SetAttributeMask( ECDHidden | ECDPrivate );
052078dda061 201025_01
hgs
parents:
diff changeset
   182
	
052078dda061 201025_01
hgs
parents:
diff changeset
   183
	ASSERT(iConnStart==0);
052078dda061 201025_01
hgs
parents:
diff changeset
   184
	iConnStart = CConnStart::NewL();
052078dda061 201025_01
hgs
parents:
diff changeset
   185
	iConnStart->Copy(aPreferences);
052078dda061 201025_01
hgs
parents:
diff changeset
   186
052078dda061 201025_01
hgs
parents:
diff changeset
   187
	// Get "defaultSnap" and "promptForSnap" from CommsDat.
052078dda061 201025_01
hgs
parents:
diff changeset
   188
    CCDGlobalSettingsRecord* gs = LoadGlobalSettingsRecordLC();
052078dda061 201025_01
hgs
parents:
diff changeset
   189
	TBool promptForSnap = gs->iPromptForSnap;
052078dda061 201025_01
hgs
parents:
diff changeset
   190
	iAPid = gs->iDefaultSnap; // Unless reassigned, iAPid becomes the default access point.
052078dda061 201025_01
hgs
parents:
diff changeset
   191
	CleanupStack::PopAndDestroy(gs);
052078dda061 201025_01
hgs
parents:
diff changeset
   192
052078dda061 201025_01
hgs
parents:
diff changeset
   193
	__FLOG_STMT(_LIT(K, "SelectL() Prompt%d Def%d"));
052078dda061 201025_01
hgs
parents:
diff changeset
   194
	__FLOG_2(K, promptForSnap, iAPid);
052078dda061 201025_01
hgs
parents:
diff changeset
   195
052078dda061 201025_01
hgs
parents:
diff changeset
   196
	if (iAPid != 0)
052078dda061 201025_01
hgs
parents:
diff changeset
   197
    	// System is access point aware.
052078dda061 201025_01
hgs
parents:
diff changeset
   198
    	{
052078dda061 201025_01
hgs
parents:
diff changeset
   199
		TConnStartType selectType(iConnStart->StartType());
052078dda061 201025_01
hgs
parents:
diff changeset
   200
		TConnPref* selectPrefs = iConnStart->ConnPrefs();
052078dda061 201025_01
hgs
parents:
diff changeset
   201
		
052078dda061 201025_01
hgs
parents:
diff changeset
   202
		if (selectType == EConnStartImplicit ||
052078dda061 201025_01
hgs
parents:
diff changeset
   203
			selectPrefs == 0 || selectPrefs->ExtensionId() == TConnPref::EConnPrefUnknown)
052078dda061 201025_01
hgs
parents:
diff changeset
   204
			// Use default access point or dialogue if enabled.
052078dda061 201025_01
hgs
parents:
diff changeset
   205
			{
052078dda061 201025_01
hgs
parents:
diff changeset
   206
			__FLOG_STMT(_LIT(K, "SelectL() Default Type%d Prefs%d"));
052078dda061 201025_01
hgs
parents:
diff changeset
   207
			__FLOG_2(K, selectType, selectPrefs);
052078dda061 201025_01
hgs
parents:
diff changeset
   208
052078dda061 201025_01
hgs
parents:
diff changeset
   209
			// Use the default access point unless promptForSnap is ETrue in which case prompt
052078dda061 201025_01
hgs
parents:
diff changeset
   210
			// for the access point.
052078dda061 201025_01
hgs
parents:
diff changeset
   211
			if (promptForSnap)
052078dda061 201025_01
hgs
parents:
diff changeset
   212
				{
052078dda061 201025_01
hgs
parents:
diff changeset
   213
				User::LeaveIfError(iDlgServ.Connect());
052078dda061 201025_01
hgs
parents:
diff changeset
   214
				iDlgServ.AccessPointConnection(iAPid,KAfInet,iStatus);
052078dda061 201025_01
hgs
parents:
diff changeset
   215
				SetActive();
052078dda061 201025_01
hgs
parents:
diff changeset
   216
				return; // Don't do selection until RunL() gets the dialogue results.
052078dda061 201025_01
hgs
parents:
diff changeset
   217
				}
052078dda061 201025_01
hgs
parents:
diff changeset
   218
052078dda061 201025_01
hgs
parents:
diff changeset
   219
			CCDIAPPrioritySelectionPolicyRecord* policy = LoadPolicyRecordLC(iAPid);
052078dda061 201025_01
hgs
parents:
diff changeset
   220
			FillListL(*policy);
052078dda061 201025_01
hgs
parents:
diff changeset
   221
			CleanupStack::PopAndDestroy(policy);
052078dda061 201025_01
hgs
parents:
diff changeset
   222
			}
052078dda061 201025_01
hgs
parents:
diff changeset
   223
		else if (selectPrefs && selectPrefs->ExtensionId() == TConnPref::EConnPrefSnap)
052078dda061 201025_01
hgs
parents:
diff changeset
   224
			// Use access point id from preferences.
052078dda061 201025_01
hgs
parents:
diff changeset
   225
			{
052078dda061 201025_01
hgs
parents:
diff changeset
   226
			iAPid = static_cast<const TCommSnapPref*>(selectPrefs)->Snap();
052078dda061 201025_01
hgs
parents:
diff changeset
   227
052078dda061 201025_01
hgs
parents:
diff changeset
   228
			__FLOG_STMT(_LIT(K, "SelectL() Type%d TConnPrefSnap AccessPoint%d "));
052078dda061 201025_01
hgs
parents:
diff changeset
   229
			__FLOG_2(K, selectType, iAPid);
052078dda061 201025_01
hgs
parents:
diff changeset
   230
052078dda061 201025_01
hgs
parents:
diff changeset
   231
			CCDIAPPrioritySelectionPolicyRecord* policy = LoadPolicyRecordLC(iAPid);
052078dda061 201025_01
hgs
parents:
diff changeset
   232
			FillListL(*policy);
052078dda061 201025_01
hgs
parents:
diff changeset
   233
			CleanupStack::PopAndDestroy(policy);
052078dda061 201025_01
hgs
parents:
diff changeset
   234
			}
052078dda061 201025_01
hgs
parents:
diff changeset
   235
		}
052078dda061 201025_01
hgs
parents:
diff changeset
   236
	}
052078dda061 201025_01
hgs
parents:
diff changeset
   237
052078dda061 201025_01
hgs
parents:
diff changeset
   238
void CIPConnectionSelector::FillListL(CCDIAPPrioritySelectionPolicyRecord& aPolicy)
052078dda061 201025_01
hgs
parents:
diff changeset
   239
	{
052078dda061 201025_01
hgs
parents:
diff changeset
   240
	__FLOG_0(_L("FillListL()"));
052078dda061 201025_01
hgs
parents:
diff changeset
   241
052078dda061 201025_01
hgs
parents:
diff changeset
   242
	// Make sure we have the TCommIdList.
052078dda061 201025_01
hgs
parents:
diff changeset
   243
	
052078dda061 201025_01
hgs
parents:
diff changeset
   244
	// Create the new Prefs on the heap so that they are always available 
052078dda061 201025_01
hgs
parents:
diff changeset
   245
	// even in the asynchronous promptForSnap Active Object callback
052078dda061 201025_01
hgs
parents:
diff changeset
   246
	// The copy of the original Prefs are overwritten here
052078dda061 201025_01
hgs
parents:
diff changeset
   247
	// The original Prefs are deleted in esock.  
052078dda061 201025_01
hgs
parents:
diff changeset
   248
	// The new Prefs are deleted on destruction of CIPConnectionSelector
052078dda061 201025_01
hgs
parents:
diff changeset
   249
	
052078dda061 201025_01
hgs
parents:
diff changeset
   250
	iConnStart->SetConnPrefs(NULL);
052078dda061 201025_01
hgs
parents:
diff changeset
   251
	iConnStart->SetConnPrefs(new (ELeave) TCommIdList);
052078dda061 201025_01
hgs
parents:
diff changeset
   252
	
052078dda061 201025_01
hgs
parents:
diff changeset
   253
	// Store Prefs for deletion on destruction of CIPConnectionSelector
052078dda061 201025_01
hgs
parents:
diff changeset
   254
	ASSERT(iPrefs==0);
052078dda061 201025_01
hgs
parents:
diff changeset
   255
	iPrefs = iConnStart->ConnPrefs();
052078dda061 201025_01
hgs
parents:
diff changeset
   256
	
052078dda061 201025_01
hgs
parents:
diff changeset
   257
	TCommIdList& list = *static_cast<TCommIdList*>(iPrefs);
052078dda061 201025_01
hgs
parents:
diff changeset
   258
052078dda061 201025_01
hgs
parents:
diff changeset
   259
	CMDBRecordLink<CCDIAPRecord>* theIap = &aPolicy.iIap1;
052078dda061 201025_01
hgs
parents:
diff changeset
   260
	CMDBField<TUint32>* theCount = &aPolicy.iIapCount;
052078dda061 201025_01
hgs
parents:
diff changeset
   261
	TInt count = static_cast<TInt>(*theCount);
052078dda061 201025_01
hgs
parents:
diff changeset
   262
	if (count > CCDIAPPrioritySelectionPolicyRecord::EMaxNrOfIaps)
052078dda061 201025_01
hgs
parents:
diff changeset
   263
		{		
052078dda061 201025_01
hgs
parents:
diff changeset
   264
		// The number of IAP's specified is more than allowed. Fix your table :-)
052078dda061 201025_01
hgs
parents:
diff changeset
   265
		ASSERT(EFalse);
052078dda061 201025_01
hgs
parents:
diff changeset
   266
		count = CCDIAPPrioritySelectionPolicyRecord::EMaxNrOfIaps;
052078dda061 201025_01
hgs
parents:
diff changeset
   267
		}	
052078dda061 201025_01
hgs
parents:
diff changeset
   268
	for (TInt i = 0; i < count; i++, theIap++)
052078dda061 201025_01
hgs
parents:
diff changeset
   269
		{
052078dda061 201025_01
hgs
parents:
diff changeset
   270
		TInt theIapNumber = static_cast<TInt>(*theIap);
052078dda061 201025_01
hgs
parents:
diff changeset
   271
		ASSERT(theIapNumber>0);
052078dda061 201025_01
hgs
parents:
diff changeset
   272
		__FLOG_STMT(_LIT(K, "aList[%d].Append(%d)"));
052078dda061 201025_01
hgs
parents:
diff changeset
   273
		__FLOG_2(K, list.Count(), theIapNumber);
052078dda061 201025_01
hgs
parents:
diff changeset
   274
		list.Append(theIapNumber);
052078dda061 201025_01
hgs
parents:
diff changeset
   275
		}
052078dda061 201025_01
hgs
parents:
diff changeset
   276
	}
052078dda061 201025_01
hgs
parents:
diff changeset
   277
052078dda061 201025_01
hgs
parents:
diff changeset
   278
void CIPConnectionSelector::SelectLinkLayerL()
052078dda061 201025_01
hgs
parents:
diff changeset
   279
	{
052078dda061 201025_01
hgs
parents:
diff changeset
   280
	CConnectionFactoryContainer* connectionFactories = SockManGlobals::Get()->iConnectionFactories;
052078dda061 201025_01
hgs
parents:
diff changeset
   281
	ASSERT(connectionFactories);
052078dda061 201025_01
hgs
parents:
diff changeset
   282
	CConnectionProviderFactoryBase* factory = connectionFactories->FindFactory(KShimConnectionProviderFactoryId);
052078dda061 201025_01
hgs
parents:
diff changeset
   283
	ASSERT(factory);
052078dda061 201025_01
hgs
parents:
diff changeset
   284
	ISelectionNotify selectNotify( this, TSelectionNotify<CIPConnectionSelector>::SelectComplete, 
052078dda061 201025_01
hgs
parents:
diff changeset
   285
	                                     TProgressNotify<CIPConnectionSelector>::ProgressNotification,
052078dda061 201025_01
hgs
parents:
diff changeset
   286
	                                     TServiceChangeNotify<CIPConnectionSelector>::ServiceChangeNotification,
052078dda061 201025_01
hgs
parents:
diff changeset
   287
	                                     TLayerUp<CIPConnectionSelector>::LayerUp,
052078dda061 201025_01
hgs
parents:
diff changeset
   288
	                                     TSubConnectionEventTmpl<CIPConnectionSelector>::SubConnectionEvent, NULL);
052078dda061 201025_01
hgs
parents:
diff changeset
   289
	selectNotify.RegisterDetach(TDetachNotify<CIPConnectionSelector>::Detach);
052078dda061 201025_01
hgs
parents:
diff changeset
   290
052078dda061 201025_01
hgs
parents:
diff changeset
   291
	if (iNextLayerSelector!=NULL)
052078dda061 201025_01
hgs
parents:
diff changeset
   292
		iNextLayerSelector->Cancel();
052078dda061 201025_01
hgs
parents:
diff changeset
   293
	
052078dda061 201025_01
hgs
parents:
diff changeset
   294
	// Select next (link) layer's provider.
052078dda061 201025_01
hgs
parents:
diff changeset
   295
	ASSERT(iNextLayerSelector==NULL);
052078dda061 201025_01
hgs
parents:
diff changeset
   296
	ASSERT(iConnStart!=NULL);
052078dda061 201025_01
hgs
parents:
diff changeset
   297
052078dda061 201025_01
hgs
parents:
diff changeset
   298
	iNextLayerSelector = factory->SelectProvider(*iConnStart, selectNotify, iSelectMessage.IsNull()? NULL : &iSelectMessage);
052078dda061 201025_01
hgs
parents:
diff changeset
   299
    
052078dda061 201025_01
hgs
parents:
diff changeset
   300
    if (iNextLayerSelector == NULL)
052078dda061 201025_01
hgs
parents:
diff changeset
   301
		{
052078dda061 201025_01
hgs
parents:
diff changeset
   302
		User::Leave(KErrGeneral);
052078dda061 201025_01
hgs
parents:
diff changeset
   303
		}
052078dda061 201025_01
hgs
parents:
diff changeset
   304
052078dda061 201025_01
hgs
parents:
diff changeset
   305
    }
052078dda061 201025_01
hgs
parents:
diff changeset
   306
052078dda061 201025_01
hgs
parents:
diff changeset
   307
void CIPConnectionSelector::SelectComplete(CConnectionProviderBase* aConnProvider, TInt aError)
052078dda061 201025_01
hgs
parents:
diff changeset
   308
    {
052078dda061 201025_01
hgs
parents:
diff changeset
   309
    CIPNetworkConnectionProvider* connProvider = NULL;
052078dda061 201025_01
hgs
parents:
diff changeset
   310
    if (aError == KErrNone)
052078dda061 201025_01
hgs
parents:
diff changeset
   311
        {
052078dda061 201025_01
hgs
parents:
diff changeset
   312
        ASSERT(aConnProvider);
052078dda061 201025_01
hgs
parents:
diff changeset
   313
        XConnectionIPFactoryQuery query(aConnProvider);
052078dda061 201025_01
hgs
parents:
diff changeset
   314
052078dda061 201025_01
hgs
parents:
diff changeset
   315
        TRAP( aError, connProvider = static_cast<CIPNetworkConnectionProvider*>(iFactory.FindOrCreateProviderL(query)));
052078dda061 201025_01
hgs
parents:
diff changeset
   316
        if (aError == KErrNone && connProvider->NextLayer() == NULL)
052078dda061 201025_01
hgs
parents:
diff changeset
   317
            {
052078dda061 201025_01
hgs
parents:
diff changeset
   318
052078dda061 201025_01
hgs
parents:
diff changeset
   319
#ifdef SYMBIAN_NETWORKING_UMTSR5	
052078dda061 201025_01
hgs
parents:
diff changeset
   320
			// This piece of code is added to keep the information about the application secure ID in the 
052078dda061 201025_01
hgs
parents:
diff changeset
   321
			// IP Connection provider. So that when the information is required form the subconnection provider
052078dda061 201025_01
hgs
parents:
diff changeset
   322
			// we can do a fetch interface and get the App Secure ID to decide on to the Socket Blocking			
052078dda061 201025_01
hgs
parents:
diff changeset
   323
                
052078dda061 201025_01
hgs
parents:
diff changeset
   324
              connProvider->SetAppSecurId(iAppSecureId.iId);            
052078dda061 201025_01
hgs
parents:
diff changeset
   325
  
052078dda061 201025_01
hgs
parents:
diff changeset
   326
          
052078dda061 201025_01
hgs
parents:
diff changeset
   327
#endif // SYMBIAN_NETWORKING_UMTSR5	            
052078dda061 201025_01
hgs
parents:
diff changeset
   328
052078dda061 201025_01
hgs
parents:
diff changeset
   329
            // The factory returned a new instance - must set the lower layer.
052078dda061 201025_01
hgs
parents:
diff changeset
   330
            TRAP(aError,connProvider->JoinNextLayerL(aConnProvider));
052078dda061 201025_01
hgs
parents:
diff changeset
   331
            }
052078dda061 201025_01
hgs
parents:
diff changeset
   332
        }
052078dda061 201025_01
hgs
parents:
diff changeset
   333
    iNotify.SelectComplete(connProvider, aError);
052078dda061 201025_01
hgs
parents:
diff changeset
   334
    }
052078dda061 201025_01
hgs
parents:
diff changeset
   335
    
052078dda061 201025_01
hgs
parents:
diff changeset
   336
void CIPConnectionSelector::ProgressNotification(TInt aStage, TInt aError)
052078dda061 201025_01
hgs
parents:
diff changeset
   337
    {
052078dda061 201025_01
hgs
parents:
diff changeset
   338
    //The original ISelectionNotifier (iNotify) might be interested in the
052078dda061 201025_01
hgs
parents:
diff changeset
   339
    //progress, but we aren't.
052078dda061 201025_01
hgs
parents:
diff changeset
   340
    iNotify.ProgressNotification(aStage, aError);
052078dda061 201025_01
hgs
parents:
diff changeset
   341
    }
052078dda061 201025_01
hgs
parents:
diff changeset
   342
052078dda061 201025_01
hgs
parents:
diff changeset
   343
void CIPConnectionSelector::LayerUp(TInt aError)
052078dda061 201025_01
hgs
parents:
diff changeset
   344
	{
052078dda061 201025_01
hgs
parents:
diff changeset
   345
    iNotify.LayerUp(aError);
052078dda061 201025_01
hgs
parents:
diff changeset
   346
	}
052078dda061 201025_01
hgs
parents:
diff changeset
   347
052078dda061 201025_01
hgs
parents:
diff changeset
   348
void CIPConnectionSelector::SubConnectionEvent(CSubConnectionProviderBase* aSubConnNextLayerProvider, const TSubConnectionEvent& aSubConnectionEvent)
052078dda061 201025_01
hgs
parents:
diff changeset
   349
	{
052078dda061 201025_01
hgs
parents:
diff changeset
   350
	iNotify.SubConnectionEvent(aSubConnNextLayerProvider, aSubConnectionEvent);
052078dda061 201025_01
hgs
parents:
diff changeset
   351
	}
052078dda061 201025_01
hgs
parents:
diff changeset
   352
	
052078dda061 201025_01
hgs
parents:
diff changeset
   353
void CIPConnectionSelector::ServiceChangeNotification(TUint32 aId, const TDesC& aType)
052078dda061 201025_01
hgs
parents:
diff changeset
   354
	{
052078dda061 201025_01
hgs
parents:
diff changeset
   355
    //The original ISelectionNotifier (iNotify) might be interested in the
052078dda061 201025_01
hgs
parents:
diff changeset
   356
    //notification, but we aren't.
052078dda061 201025_01
hgs
parents:
diff changeset
   357
    iNotify.ServiceChangeNotification(aId, aType);
052078dda061 201025_01
hgs
parents:
diff changeset
   358
	}
052078dda061 201025_01
hgs
parents:
diff changeset
   359
052078dda061 201025_01
hgs
parents:
diff changeset
   360
void CIPConnectionSelector::Detach()
052078dda061 201025_01
hgs
parents:
diff changeset
   361
	{
052078dda061 201025_01
hgs
parents:
diff changeset
   362
	iNextLayerSelector = NULL;
052078dda061 201025_01
hgs
parents:
diff changeset
   363
	//Ensure the asynch destructor is ready to use.
052078dda061 201025_01
hgs
parents:
diff changeset
   364
	//If its not, then we have probably been already deleted which should never happen.
052078dda061 201025_01
hgs
parents:
diff changeset
   365
	//Detach is the only place we should be deleted from.
052078dda061 201025_01
hgs
parents:
diff changeset
   366
	ASSERT(!iAsyncDestructor.IsActive());
052078dda061 201025_01
hgs
parents:
diff changeset
   367
	__FLOG_1(_L8("CIPConnectionSelector %08x::Detach()"), this);
052078dda061 201025_01
hgs
parents:
diff changeset
   368
	iAsyncDestructor.Call();
052078dda061 201025_01
hgs
parents:
diff changeset
   369
	}
052078dda061 201025_01
hgs
parents:
diff changeset
   370
052078dda061 201025_01
hgs
parents:
diff changeset
   371
CIPConnectionSelector::CIPConnectionSelector(ISelectionNotify& aNotify, CIPNetworkProviderFactory& aFactory)
052078dda061 201025_01
hgs
parents:
diff changeset
   372
:	CActive(CActive::EPriorityUserInput),
052078dda061 201025_01
hgs
parents:
diff changeset
   373
	iNotify(aNotify),
052078dda061 201025_01
hgs
parents:
diff changeset
   374
	iFactory(aFactory),
052078dda061 201025_01
hgs
parents:
diff changeset
   375
	iAsyncDestructor(CActive::EPriorityLow)
052078dda061 201025_01
hgs
parents:
diff changeset
   376
	{
052078dda061 201025_01
hgs
parents:
diff changeset
   377
	__FLOG_1(_L8("CIPConnectionSelector %08x::CIPConnectionSelector()"), this);
052078dda061 201025_01
hgs
parents:
diff changeset
   378
	CActiveScheduler::Add(this);
052078dda061 201025_01
hgs
parents:
diff changeset
   379
	iAsyncDestructor.Set(TCallBack(CIPConnectionSelector::DestroyMyself, this));
052078dda061 201025_01
hgs
parents:
diff changeset
   380
	
052078dda061 201025_01
hgs
parents:
diff changeset
   381
  	}
052078dda061 201025_01
hgs
parents:
diff changeset
   382
052078dda061 201025_01
hgs
parents:
diff changeset
   383
TInt CIPConnectionSelector::DestroyMyself(TAny* aSelf)
052078dda061 201025_01
hgs
parents:
diff changeset
   384
	{
052078dda061 201025_01
hgs
parents:
diff changeset
   385
	delete static_cast<CIPConnectionSelector*>(aSelf);
052078dda061 201025_01
hgs
parents:
diff changeset
   386
	return KErrNone;
052078dda061 201025_01
hgs
parents:
diff changeset
   387
	}
052078dda061 201025_01
hgs
parents:
diff changeset
   388
052078dda061 201025_01
hgs
parents:
diff changeset
   389
CIPConnectionSelector::~CIPConnectionSelector()
052078dda061 201025_01
hgs
parents:
diff changeset
   390
    {
052078dda061 201025_01
hgs
parents:
diff changeset
   391
    __FLOG_CLOSE;
052078dda061 201025_01
hgs
parents:
diff changeset
   392
	CActive::Cancel(); // There may be an outstanding selection request.
052078dda061 201025_01
hgs
parents:
diff changeset
   393
052078dda061 201025_01
hgs
parents:
diff changeset
   394
	// This destructor is private and is meant to be called asynchronously via Detach() or Cancel() only.
052078dda061 201025_01
hgs
parents:
diff changeset
   395
	// If is was called from anywhere else, the iNextLayerSelector would not be deleted!
052078dda061 201025_01
hgs
parents:
diff changeset
   396
	// Please note that deleting iNextLayerSelector here needs revision on the link layer selectors,
052078dda061 201025_01
hgs
parents:
diff changeset
   397
	// and specifically of the shim selector which - in such case - must not call Detach from its
052078dda061 201025_01
hgs
parents:
diff changeset
   398
	// synchronous destructor!
052078dda061 201025_01
hgs
parents:
diff changeset
   399
	ASSERT(iNextLayerSelector==NULL); // If still a valid pointer - probably not called via Detach() or Cancel().
052078dda061 201025_01
hgs
parents:
diff changeset
   400
052078dda061 201025_01
hgs
parents:
diff changeset
   401
	delete iDbs;
052078dda061 201025_01
hgs
parents:
diff changeset
   402
	
052078dda061 201025_01
hgs
parents:
diff changeset
   403
	// Tidy up iConnStart and related objects
052078dda061 201025_01
hgs
parents:
diff changeset
   404
	delete iPrefs;
052078dda061 201025_01
hgs
parents:
diff changeset
   405
	delete iConnStart;
052078dda061 201025_01
hgs
parents:
diff changeset
   406
	
052078dda061 201025_01
hgs
parents:
diff changeset
   407
	iDlgServ.Close();
052078dda061 201025_01
hgs
parents:
diff changeset
   408
052078dda061 201025_01
hgs
parents:
diff changeset
   409
	// Notify detach.
052078dda061 201025_01
hgs
parents:
diff changeset
   410
	iNotify.Detach();
052078dda061 201025_01
hgs
parents:
diff changeset
   411
    }
052078dda061 201025_01
hgs
parents:
diff changeset
   412
052078dda061 201025_01
hgs
parents:
diff changeset
   413
void CIPConnectionSelector::RunL()
052078dda061 201025_01
hgs
parents:
diff changeset
   414
	// The dialogue has been presented.
052078dda061 201025_01
hgs
parents:
diff changeset
   415
	// Normally completes with KErrNone or KErrCancel
052078dda061 201025_01
hgs
parents:
diff changeset
   416
	// Could, however, complete with another system error e.g. KErrOutOfMemory
052078dda061 201025_01
hgs
parents:
diff changeset
   417
	{
052078dda061 201025_01
hgs
parents:
diff changeset
   418
	__FLOG_STMT(_LIT(K, "RunL() Err%d Snap%d"));
052078dda061 201025_01
hgs
parents:
diff changeset
   419
	__FLOG_2(K, iStatus.Int(), iAPid);
052078dda061 201025_01
hgs
parents:
diff changeset
   420
052078dda061 201025_01
hgs
parents:
diff changeset
   421
    User::LeaveIfError(iStatus.Int());
052078dda061 201025_01
hgs
parents:
diff changeset
   422
    ASSERT(iAPid); //Should not be 0 now.
052078dda061 201025_01
hgs
parents:
diff changeset
   423
	CCDIAPPrioritySelectionPolicyRecord* policy = LoadPolicyRecordLC(iAPid);
052078dda061 201025_01
hgs
parents:
diff changeset
   424
	FillListL(*policy);
052078dda061 201025_01
hgs
parents:
diff changeset
   425
	CleanupStack::PopAndDestroy(policy);
052078dda061 201025_01
hgs
parents:
diff changeset
   426
	SelectLinkLayerL();
052078dda061 201025_01
hgs
parents:
diff changeset
   427
	}
052078dda061 201025_01
hgs
parents:
diff changeset
   428
052078dda061 201025_01
hgs
parents:
diff changeset
   429
TInt CIPConnectionSelector::RunError(TInt aError)
052078dda061 201025_01
hgs
parents:
diff changeset
   430
	// Either the dialogue, the FillListL() or the SelectLinkLayerL() failed.
052078dda061 201025_01
hgs
parents:
diff changeset
   431
	// In each case the selection request is completed with the apropriate result code.
052078dda061 201025_01
hgs
parents:
diff changeset
   432
	{
052078dda061 201025_01
hgs
parents:
diff changeset
   433
	iNotify.SelectComplete(0, aError);
052078dda061 201025_01
hgs
parents:
diff changeset
   434
 	
052078dda061 201025_01
hgs
parents:
diff changeset
   435
 	//If we have failed before the call to iNextLayerSelector->Select() or it wasn't successful
052078dda061 201025_01
hgs
parents:
diff changeset
   436
 	//we need to initiate the detach sequence by calling Detach().
052078dda061 201025_01
hgs
parents:
diff changeset
   437
 	 if (iNextLayerSelector==NULL)
052078dda061 201025_01
hgs
parents:
diff changeset
   438
	 	{
052078dda061 201025_01
hgs
parents:
diff changeset
   439
	 	Detach(); //It will result in self deletion.
052078dda061 201025_01
hgs
parents:
diff changeset
   440
	 	}
052078dda061 201025_01
hgs
parents:
diff changeset
   441
	return KErrNone;
052078dda061 201025_01
hgs
parents:
diff changeset
   442
	}
052078dda061 201025_01
hgs
parents:
diff changeset
   443
052078dda061 201025_01
hgs
parents:
diff changeset
   444
void CIPConnectionSelector::DoCancel()
052078dda061 201025_01
hgs
parents:
diff changeset
   445
	{
052078dda061 201025_01
hgs
parents:
diff changeset
   446
	iDlgServ.CancelAccessPointConnection();
052078dda061 201025_01
hgs
parents:
diff changeset
   447
	}
052078dda061 201025_01
hgs
parents:
diff changeset
   448
052078dda061 201025_01
hgs
parents:
diff changeset
   449
CCDGlobalSettingsRecord* CIPConnectionSelector::LoadGlobalSettingsRecordLC()
052078dda061 201025_01
hgs
parents:
diff changeset
   450
	{
052078dda061 201025_01
hgs
parents:
diff changeset
   451
	CCDGlobalSettingsRecord* gs = static_cast<CCDGlobalSettingsRecord*>(CCDConnectionPrefsRecord::RecordFactoryL(KCDTIdGlobalSettingsRecord));
052078dda061 201025_01
hgs
parents:
diff changeset
   452
	CleanupStack::PushL(gs);
052078dda061 201025_01
hgs
parents:
diff changeset
   453
	gs->SetRecordId(1);
052078dda061 201025_01
hgs
parents:
diff changeset
   454
	gs->LoadL(*iDbs);
052078dda061 201025_01
hgs
parents:
diff changeset
   455
	ASSERT(gs->iDefaultSnap.TypeId() == KCDTIdDefaultSnap); // Panics if built against incorrect CommsDat.
052078dda061 201025_01
hgs
parents:
diff changeset
   456
	return gs;
052078dda061 201025_01
hgs
parents:
diff changeset
   457
	}
052078dda061 201025_01
hgs
parents:
diff changeset
   458
052078dda061 201025_01
hgs
parents:
diff changeset
   459
CCDIAPPrioritySelectionPolicyRecord* CIPConnectionSelector::LoadPolicyRecordLC(TInt aAccessPoint)
052078dda061 201025_01
hgs
parents:
diff changeset
   460
	{
052078dda061 201025_01
hgs
parents:
diff changeset
   461
	// Get access point from CommsDat.
052078dda061 201025_01
hgs
parents:
diff changeset
   462
	CCDAccessPointRecord* apRecord = static_cast<CCDAccessPointRecord*>
052078dda061 201025_01
hgs
parents:
diff changeset
   463
		(CCDConnectionPrefsRecord::RecordFactoryL(KCDTIdAccessPointRecord));
052078dda061 201025_01
hgs
parents:
diff changeset
   464
	CleanupStack::PushL(apRecord);
052078dda061 201025_01
hgs
parents:
diff changeset
   465
	apRecord->SetRecordId(aAccessPoint);
052078dda061 201025_01
hgs
parents:
diff changeset
   466
	apRecord->LoadL(*iDbs);
052078dda061 201025_01
hgs
parents:
diff changeset
   467
	TUint32 policyNumber = apRecord->iSelectionPolicy;
052078dda061 201025_01
hgs
parents:
diff changeset
   468
	CleanupStack::PopAndDestroy(apRecord);
052078dda061 201025_01
hgs
parents:
diff changeset
   469
052078dda061 201025_01
hgs
parents:
diff changeset
   470
	ASSERT((policyNumber & KCDMaskShowRecordType) == KCDTIdIapPrioritySelectionPolicyRecord);
052078dda061 201025_01
hgs
parents:
diff changeset
   471
052078dda061 201025_01
hgs
parents:
diff changeset
   472
	CCDIAPPrioritySelectionPolicyRecord* policy = static_cast<CCDIAPPrioritySelectionPolicyRecord*>
052078dda061 201025_01
hgs
parents:
diff changeset
   473
		(CCDConnectionPrefsRecord::RecordFactoryL(KCDTIdIapPrioritySelectionPolicyRecord));
052078dda061 201025_01
hgs
parents:
diff changeset
   474
	CleanupStack::PushL(policy);
052078dda061 201025_01
hgs
parents:
diff changeset
   475
	policy->SetElementId(policyNumber);
052078dda061 201025_01
hgs
parents:
diff changeset
   476
	policy->LoadL(*iDbs);
052078dda061 201025_01
hgs
parents:
diff changeset
   477
	return policy;
052078dda061 201025_01
hgs
parents:
diff changeset
   478
	}
052078dda061 201025_01
hgs
parents:
diff changeset
   479
052078dda061 201025_01
hgs
parents:
diff changeset
   480
MCommsFactoryQuery::TMatchResult XConnectionIPFactoryQuery::Match( TFactoryObjectInfo& aProviderInfo )
052078dda061 201025_01
hgs
parents:
diff changeset
   481
	{
052078dda061 201025_01
hgs
parents:
diff changeset
   482
	CConnectionProviderBase* prov = static_cast<CConnectionProviderBase*>(aProviderInfo.iInfo.iFactoryObject);
052078dda061 201025_01
hgs
parents:
diff changeset
   483
	//if the next layer is the same as the one returned by the shim selection we have a match
052078dda061 201025_01
hgs
parents:
diff changeset
   484
	return prov->NextLayer() == iConnectionProviderBase ? EMatch : EContinue;
052078dda061 201025_01
hgs
parents:
diff changeset
   485
	}
052078dda061 201025_01
hgs
parents:
diff changeset
   486