telephonyserver/etelmultimode/CETEL/mm_scappeap.cpp
changeset 0 3553901f7fa8
child 24 6638e7f4bd8f
equal deleted inserted replaced
-1:000000000000 0:3553901f7fa8
       
     1 // Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // This file contains the definition for the ETelMM sub-session
       
    15 // RMobileSmartCardEap, which allows access to EAP supporting UICC
       
    16 // applications and all their functionality.
       
    17 // (See specification: ETSI TS 102 310 v6.2.0)
       
    18 // 
       
    19 //
       
    20 
       
    21 /**
       
    22  @file
       
    23 */
       
    24 
       
    25 // From core API
       
    26 #include <etelext.h>
       
    27 
       
    28 // Multimode header files
       
    29 #include <etelmm.h>
       
    30 #include "mm_hold.h"
       
    31 #include "mmretrieve.h"
       
    32 
       
    33 //
       
    34 //
       
    35 //  RMobileSmartCardEap
       
    36 //
       
    37 //
       
    38 
       
    39 /**
       
    40 Default empty constructor, and is present only to support virtual
       
    41 function table export.
       
    42 
       
    43 @publishedPartner
       
    44 @released
       
    45 */
       
    46 EXPORT_C RMobileSmartCardEap::RMobileSmartCardEap()
       
    47 	: iMmPtrHolder(NULL), iOwnsEapMethodLock(EFalse)
       
    48 	{
       
    49 	}
       
    50 
       
    51 /**
       
    52 This function opens a RMobileSmartCardEap sub-session from RMobilePhone
       
    53 that will refer to the application referenced by aAID.  It will be
       
    54 assumed that the application exists and contains a DF_EAP for the
       
    55 aEapType specified.  The client must call
       
    56 RMobileSmartCardEap::InitialiseEapMethod() to ensure correct
       
    57 functionality of this sub-session.
       
    58 
       
    59 @param aPhone The RMobilePhone sub-session relative to which this
       
    60               sub-session will open.
       
    61 @param aAId The UICC Application ID, which should be of one that has
       
    62             EAP support.
       
    63 @param aEapType The EAP method type that this sub-session will use
       
    64                 under the aAID application.
       
    65 
       
    66 @return KErrNone if successful, otherwise a system-wide error code.
       
    67 @see RMobileSmartCardEap::InitialiseEapMethod()
       
    68 
       
    69 @capability None
       
    70 
       
    71 @publishedPartner
       
    72 @released
       
    73 */
       
    74 EXPORT_C TInt RMobileSmartCardEap::Open(RMobilePhone& aPhone, const RMobilePhone::TAID& aAID, const TEapType& aEapType)
       
    75 	{
       
    76 	RSessionBase* session = &aPhone.SessionHandle();
       
    77 	__ASSERT_ALWAYS(session != NULL, PanicClient(EEtelPanicNullHandle));
       
    78 	TInt subSessionHandle = aPhone.SubSessionHandle();
       
    79 	__ASSERT_ALWAYS(subSessionHandle != NULL, PanicClient(EEtelPanicNullHandle));
       
    80 
       
    81 	TRAPD(ret, ConstructL());
       
    82 	if (ret != KErrNone)
       
    83 		{
       
    84 		Destruct();
       
    85 		return ret;
       
    86 		}
       
    87 
       
    88 	// Appending the application ID and Eap Type to the name of the
       
    89 	// subsession; plus two one-byte delimeters indicating lengths.
       
    90 	// See var appIdbuf for why KAIDSize is multiplied by 2.
       
    91 	TBufC<SCEAP_SSN_LENGTH + RMobilePhone::KAIDSize*2 +
       
    92 	      KEapTypeSize + 2> nameBuf(KETelSmartCardEapSession); // 2 for delimeters
       
    93 	TPtr name(nameBuf.Des());
       
    94 
       
    95 	// the length of the AID as a Sept ASCII character
       
    96 	TChar lengthAIDChar = SeptChar(aAID.Length());
       
    97 
       
    98 	// the value of the AID
       
    99 	// converted to a 16-bit string representation.  Multiply by 2,
       
   100 	// since each AID byte is represented as two sem-octects.
       
   101 	TBufC<2*RMobilePhone::KAIDSize> appIdbuf;
       
   102 	TPtr appIdPtr(appIdbuf.Des());
       
   103 	ConvertBinToText(aAID, appIdPtr);
       
   104 
       
   105 	// the length of the EapType
       
   106 	TInt lengthEapType = aEapType.Length();
       
   107 	TChar charEapType = SeptChar(lengthEapType);
       
   108 
       
   109 	// the value of the EapType (converted to 16-bit)
       
   110 	TBufC<KEapTypeSize> eapTypeBuf;
       
   111 	TPtr eapTypePtr(eapTypeBuf.Des());
       
   112 	eapTypePtr.Copy(aEapType);
       
   113 
       
   114 	// appending...
       
   115 	name.Append(lengthAIDChar);
       
   116 	name.Append(appIdPtr);
       
   117 	name.Append(charEapType);
       
   118 	name.Append(eapTypePtr);
       
   119 
       
   120 	TIpcArgs args(&name, TIpcArgs::ENothing, subSessionHandle);
       
   121 	SetSessionHandle(*session);
       
   122 	ret = CreateSubSession(*session, EEtelOpenFromSubSession, args);
       
   123 
       
   124 	if (ret != KErrNone)
       
   125 		{
       
   126 		Destruct();
       
   127 		}
       
   128 
       
   129 	return ret;
       
   130 	}
       
   131 
       
   132 /**
       
   133 This function member closes a RMobileSmartCardEap sub-session.  The
       
   134 Close() request also attempts to release this instance's lock on the
       
   135 <AID,EAPType> (DF_EAP).
       
   136 
       
   137 @panic Panics the client with ETel Panic EEtelPanicHandleNotClosed, if
       
   138        this instance owns the lock on the DF_EAP but could not release
       
   139        some resource to allow other instances to gain access.
       
   140        (However, it should be noted that the TSY can take control of
       
   141        DF_EAP access in the event that a client dies in such a manner.)
       
   142 @see RMobileSmartCardEap::ReleaseEapMethod()
       
   143 
       
   144 @capability None
       
   145 
       
   146 @publishedPartner
       
   147 @released
       
   148 */
       
   149 EXPORT_C void RMobileSmartCardEap::Close()
       
   150 	{
       
   151 	if (iOwnsEapMethodLock)
       
   152 		{
       
   153 		TInt err = ReleaseEapMethod();
       
   154 		if (err != KErrNone)
       
   155 			{
       
   156 			PanicClient(EEtelPanicHandleNotClosed);
       
   157 			}
       
   158 		}
       
   159 
       
   160 	CloseSubSession(EEtelClose);
       
   161 	Destruct();
       
   162 	}
       
   163 
       
   164 /**
       
   165 Initialises access to the DF_EAP.  This will ensure the aAID and
       
   166 aEapType given in the RMobileSmartCardEap::Open() exist and are
       
   167 accessible.  If for any reason the sub-session is inaccessible, the
       
   168 client can request a notification for state changes using
       
   169 RMobileSmartCardEap::NotifyEapMethodAccessStatusChange().
       
   170 
       
   171 @param aReqStatus Returns the result code after the asynchronous call
       
   172                   completes.  Successful completion is only achieved
       
   173                   when the client is the first to request
       
   174                   initialisation on this sub-session.
       
   175                   KErrInUse will be returned if another
       
   176                   RMobileSmartCardEap instance successfully achieved
       
   177                   initialisation first.
       
   178                   Any other error code returned as request completion,
       
   179                   suggests another problem in the system and the client
       
   180                   must call RMobileSmartCardEap::Close() or
       
   181                   RMobileSmartCardEap::ReleaseEapMethod() at some
       
   182                   point, to allow other clients to use this same
       
   183                   <AID,EapType> sub-session.
       
   184 @see RMobileSmartCardEap::Open()
       
   185 @see RMobileSmartCardEap::NotifyEapMethodAccessStatusChange()
       
   186 
       
   187 @capability ReadDeviceData
       
   188 @capability NetworkControl
       
   189 
       
   190 @publishedPartner
       
   191 @released
       
   192 */
       
   193 EXPORT_C void RMobileSmartCardEap::InitialiseEapMethod(TRequestStatus& aReqStatus)
       
   194 	{
       
   195 	__ASSERT_ALWAYS(iMmPtrHolder != NULL, PanicClient(EEtelPanicNullHandle));
       
   196 
       
   197 	if (!iOwnsEapMethodLock)
       
   198 		{
       
   199 		TInt ret = KErrNone;
       
   200 
       
   201 		TInt semHandle = SendReceive(EEtelGlobalKernelObjectHandle);
       
   202 
       
   203 		if(semHandle > 0)
       
   204 			{
       
   205 			ret = iSemaphore.SetReturnedHandle(semHandle); // although this will take an error as handle, best to specify our own explicit KErrBadHandle in the following else.
       
   206 			}
       
   207 		else
       
   208 			{
       
   209 			ret = KErrBadHandle;
       
   210 			}
       
   211 
       
   212 		if (ret != KErrNone)
       
   213 			{
       
   214 			TRequestStatus* status1 = &aReqStatus;
       
   215 			User::RequestComplete(status1, ret);
       
   216 			return;
       
   217 			}
       
   218 
       
   219 		ret = iSemaphore.Wait(10);
       
   220 		if (ret == KErrTimedOut)
       
   221 			{
       
   222 			TRequestStatus* status2 = &aReqStatus;
       
   223 			User::RequestComplete(status2, KErrInUse);
       
   224 			return;
       
   225 			}
       
   226 		else if (ret != KErrNone)
       
   227 			{
       
   228 			TRequestStatus* status3 = &aReqStatus;
       
   229 			User::RequestComplete(status3, ret);
       
   230 			return;
       
   231 			}
       
   232 
       
   233 		iOwnsEapMethodLock = ETrue;
       
   234 		}
       
   235 
       
   236 	RThread ownerThread;
       
   237 	TThreadId ownerThreadId = ownerThread.Id();
       
   238 
       
   239 	iMmPtrHolder->iOwnerThreadId = ownerThreadId;
       
   240 	TPtrC8& ptr1 = iMmPtrHolder->SetC(CMobileSmartCardEapPtrHolder::ESlot1InitialiseEapMethod, iMmPtrHolder->iOwnerThreadId);
       
   241 
       
   242 	Set(EMobileSmartCardEapInitialiseEapMethod, aReqStatus, ptr1);
       
   243 	}
       
   244 
       
   245 /**
       
   246 Delayed construction of heap stored data members.
       
   247 
       
   248 @leave KErrNoMemory Heap memory allocation failure for
       
   249                     CMobileSmartCardEapPtrHolder object.
       
   250 
       
   251 @publishedPartner
       
   252 @released
       
   253 */
       
   254 EXPORT_C void RMobileSmartCardEap::ConstructL()
       
   255 	{
       
   256 	__ASSERT_ALWAYS(iMmPtrHolder == NULL, PanicClient(EEtelPanicHandleNotClosed));
       
   257 	iMmPtrHolder = CMobileSmartCardEapPtrHolder::NewL(CMobileSmartCardEapPtrHolder::EMaxNumberSmartCardEapPtrSlots,
       
   258 	                                                  CMobileSmartCardEapPtrHolder::EMaxNumberSmartCardEapPtrCSlots);
       
   259 	}
       
   260 
       
   261 /**
       
   262 Called internally when RMobileSmartCardEap instance is no longer
       
   263 required, to ensure clean up of data members from memory.
       
   264 
       
   265 @publishedPartner
       
   266 @released
       
   267 */
       
   268 EXPORT_C void RMobileSmartCardEap::Destruct()
       
   269 	{
       
   270 	delete iMmPtrHolder;
       
   271 	iMmPtrHolder = NULL;
       
   272 	ResetSessionHandle();
       
   273 	}
       
   274 
       
   275 /**
       
   276 Default constructor, initialising version number of this data
       
   277 structure.
       
   278 
       
   279 @see TMultimodeEtelV6Api
       
   280 
       
   281 @publishedPartner
       
   282 @released
       
   283 */
       
   284 EXPORT_C RMobileSmartCardEap::TEapUserIdentityV6::TEapUserIdentityV6()
       
   285 	{
       
   286 	iExtensionId = KEtelExtMultimodeV6;
       
   287 	}
       
   288 
       
   289 /**
       
   290 Default constructor, initialising version number of this data
       
   291 structure.
       
   292 
       
   293 @see TMultimodeEtelV6Api
       
   294 
       
   295 @publishedPartner
       
   296 @released
       
   297 */
       
   298 EXPORT_C RMobileSmartCardEap::TEapKeyV6::TEapKeyV6()
       
   299 	{
       
   300 	iExtensionId = KEtelExtMultimodeV6;
       
   301 	}
       
   302 
       
   303 /**
       
   304 This method allows the client to retrieve the user identity data to be
       
   305 used for an EAP based authentication.  The client will specify which
       
   306 identity type they want to read by setting the aRequestIdType parameter
       
   307 to the appropriate enumeration value.  The user Id data is returned as
       
   308 a packaged instance of TEapUserIdentityV6 within the aUserId.
       
   309 
       
   310 An example base band functionality that would be used to service this
       
   311 request is the +CEPR (see section 8.48 of 3GPP TS 27.007 v6.8.0) AT-
       
   312 command, which returns "identity" and "pseudonym" as two of its defined
       
   313 values.
       
   314 
       
   315 EF_PUId and EF_Ps hold these identities (specified in sections 7.3 and
       
   316 7.4, respectively, of ETSI TS 102.310 v6.2.0).
       
   317 
       
   318 @param aReqStatus Returns the result code after the asynchronous call
       
   319                   completes.
       
   320 @param aRequestIdType Used to request the specific identity the client
       
   321                       wishes to retrieve.
       
   322 @param aUserId On completion, will be populated with the user identity
       
   323                requested by the client.
       
   324 
       
   325 @capability ReadDeviceData
       
   326 
       
   327 @publishedPartner
       
   328 @released
       
   329 */
       
   330 EXPORT_C void RMobileSmartCardEap::GetUserIdentity(TRequestStatus& aReqStatus, const TEapUserIdType aRequestedIdType, TDes8& aUserId)
       
   331 	{
       
   332 	__ASSERT_ALWAYS(iMmPtrHolder != NULL, PanicClient(EEtelPanicNullHandle));
       
   333 
       
   334 	if (iSemaphore.Handle() == 0)
       
   335 		{
       
   336 		TRequestStatus* status1 = &aReqStatus;
       
   337 		User::RequestComplete(status1, KErrBadHandle);
       
   338 		return;
       
   339 		}
       
   340 
       
   341 	if (!iOwnsEapMethodLock)
       
   342 		{
       
   343 		TRequestStatus* status2 = &aReqStatus;
       
   344 		User::RequestComplete(status2, KErrInUse);
       
   345 		return;
       
   346 		}
       
   347 
       
   348 	iMmPtrHolder->iEapUserIdType = aRequestedIdType;
       
   349 	TPtrC8& ptr1 = iMmPtrHolder->SetC(CMobileSmartCardEapPtrHolder::ESlot1GetUserId, iMmPtrHolder->iEapUserIdType);
       
   350 
       
   351 	SetAndGet(EMobileSmartCardEapGetUserIdentity, aReqStatus, ptr1, aUserId);
       
   352 	}
       
   353 
       
   354 /**
       
   355 The authentication status is obtained from the EAP supporting UICC
       
   356 application's EF_EAPSTATUS.  It specifies the current state of
       
   357 authentication in the DF_EAP.
       
   358 
       
   359 @param aReqStatus Returns the result code after the asynchronous call
       
   360                   completes.
       
   361 @param aAuthStatus On request completion, will store the current
       
   362                    authentication status of the DF_EAP.
       
   363 
       
   364 @capability ReadDeviceData
       
   365 
       
   366 @publishedPartner
       
   367 @released
       
   368 */
       
   369 EXPORT_C void RMobileSmartCardEap::GetAuthenticationStatus(TRequestStatus& aReqStatus, TEapAuthStatus& aAuthStatus)
       
   370 	{
       
   371 	__ASSERT_ALWAYS(iMmPtrHolder != NULL, PanicClient(EEtelPanicNullHandle));
       
   372 
       
   373 	if (iSemaphore.Handle() == 0)
       
   374 		{
       
   375 		TRequestStatus* status1 = &aReqStatus;
       
   376 		User::RequestComplete(status1, KErrBadHandle);
       
   377 		return;
       
   378 		}
       
   379 
       
   380 	if (!iOwnsEapMethodLock)
       
   381 		{
       
   382 		TRequestStatus* status2 = &aReqStatus;
       
   383 		User::RequestComplete(status2, KErrInUse);
       
   384 		return;
       
   385 		}
       
   386 
       
   387 	TPtr8& ptr1 = iMmPtrHolder->Set(CMobileSmartCardEapPtrHolder::ESlot1GetAuthStatus, aAuthStatus);
       
   388 
       
   389 	Get(EMobileSmartCardEapGetAuthenticationStatus, aReqStatus, ptr1);
       
   390 	}
       
   391 
       
   392 /**
       
   393 Retrieves the generated key stored in EF_EAPKEYS of the DF_EAP (see
       
   394 section 7.1 of ETSI TS 102.310 v6.2.0).
       
   395 
       
   396 @param aReqStatus Returns the result code after the asynchronous call
       
   397                   completes.
       
   398 @param aRequestedKey Used to specify which of the keys the client is
       
   399                      requesting.
       
   400 @param aKey Populated with the requested key on request completion.
       
   401 
       
   402 @capability ReadDeviceData
       
   403 
       
   404 @publishedPartner
       
   405 @released
       
   406 */
       
   407 EXPORT_C void RMobileSmartCardEap::GetEapKey(TRequestStatus& aReqStatus, const TEapKeyTag aRequestedKey, TDes8& aKey)
       
   408 	{
       
   409 	__ASSERT_ALWAYS(iMmPtrHolder != NULL, PanicClient(EEtelPanicNullHandle));
       
   410 
       
   411 	if (iSemaphore.Handle() == 0)
       
   412 		{
       
   413 		TRequestStatus* status1 = &aReqStatus;
       
   414 		User::RequestComplete(status1, KErrBadHandle);
       
   415 		return;
       
   416 		}
       
   417 
       
   418 	if (!iOwnsEapMethodLock)
       
   419 		{
       
   420 		TRequestStatus* status2 = &aReqStatus;
       
   421 		User::RequestComplete(status2, KErrInUse);
       
   422 		return;
       
   423 		}
       
   424 
       
   425 	iMmPtrHolder->iReqEapKeyTag = aRequestedKey;
       
   426 	TPtrC8& ptr1 = iMmPtrHolder->SetC(CMobileSmartCardEapPtrHolder::ESlot1GetEapKey, iMmPtrHolder->iReqEapKeyTag);
       
   427 
       
   428 	SetAndGet(EMobileSmartCardEapGetEapKey, aReqStatus, ptr1, aKey);
       
   429 	}
       
   430 
       
   431 /**
       
   432 Relinquishes ownership of the DF_EAP, to allow other clients to use it.
       
   433 Although the request completes relatively quickly, it will set the
       
   434 server's process running to attempt a deactivate on the sub-session's
       
   435 corresponding application.  The deactivate will allow future clients to
       
   436 initialise the application, which should reset all its DF_EAP states.
       
   437 
       
   438 The initial state change of the sub-session will be
       
   439 EEapMethodUnableToInitialise, as the request completes without waiting
       
   440 for the application's deactivation.  After the sub-session is able to
       
   441 deactivate the app, the state will change to EEapMethodAvailable.
       
   442 
       
   443 The server will make a decision on deactivating the application based
       
   444 on whether there are other sub-session open to the same application
       
   445 (but different EAP types/ DF_EAP).  Only when the application is no
       
   446 longer in use, that the server will deactivate it.
       
   447 
       
   448 Notifications can be posted using
       
   449 RMobileSmartCardEap::NotifyEapMethodAccessStatusChange() to observe
       
   450 such state changes.
       
   451 
       
   452 @return If an error is returned, this object will maintain lock on the
       
   453         UICC application's DF_EAP.
       
   454 @see RMobileSmartCardEap::NotifyEapMethodAccessStatusChange()
       
   455 
       
   456 @capability ReadDeviceData
       
   457 
       
   458 @publishedPartner
       
   459 @released
       
   460 */
       
   461 EXPORT_C TInt RMobileSmartCardEap::ReleaseEapMethod()
       
   462 	{
       
   463 	if (iSemaphore.Handle() == 0)
       
   464 		{
       
   465 		return KErrBadHandle;
       
   466 		}
       
   467 
       
   468 	if (!iOwnsEapMethodLock)
       
   469 		{
       
   470 		return KErrInUse;
       
   471 		}
       
   472 
       
   473 	TInt ret = Blank(EMobileSmartCardEapReleaseEapMethod);
       
   474 
       
   475 	if (ret == KErrNone)
       
   476 		{
       
   477 		iSemaphore.Signal();
       
   478 		iOwnsEapMethodLock = EFalse;
       
   479 		}
       
   480 
       
   481 	return ret;
       
   482 	}
       
   483 
       
   484 /**
       
   485 Synchronous request to get the current status of the DF_EAP.  This
       
   486 state value is held by the platform to ensure exclusive access to a
       
   487 DF_EAP; it is NOT a state of any Smart Card Application file.
       
   488 
       
   489 @param aEapMethodStatus Returns the sub-session's current value of
       
   490                         RMobileSmartCardEap::TEapMethodAccessStatus.
       
   491 
       
   492 @capability ReadDeviceData
       
   493 
       
   494 @publishedPartner
       
   495 @released
       
   496 */
       
   497 EXPORT_C TInt RMobileSmartCardEap::GetEapMethodAccessStatus(TEapMethodAccessStatus& aEapMethodStatus)
       
   498 	{
       
   499 	TPckg<TEapMethodAccessStatus> ptr1(aEapMethodStatus);
       
   500 	return Get(EMobileSmartCardEapGetEapMethodAccessStatus, ptr1);
       
   501 	}
       
   502 
       
   503 /**
       
   504 Notifies the client when the EAP method's (DF_EAP's) access status
       
   505 changes.
       
   506 
       
   507 The status begins as EEapMethodAvailable when the DF_EAP is first used;
       
   508 before RMobileSmartCardEap::InitialiseEapMethod() is called by the
       
   509 client.  EEapMethodInUseApplicationActive state is given after the
       
   510 first client initialises... various cases cause transformations to
       
   511 states EEapMethodUnableToInitialise or
       
   512 EEapMethodInUseApplicationInactive.
       
   513 
       
   514 @param aReqStatus Returns the result code after the asynchronous call
       
   515                   completes.
       
   516 @param aEapMethodStatus Returns the 
       
   517                         RMobileSmartCardEap::TEapMethodAccessStatus
       
   518                         value when the status changes on this sub-
       
   519                         session.
       
   520 @see RMobileSmartCardEap::InitialiseEapMethod()
       
   521 @see RMobileSmartCardEap::GetEapMethodAccessStatus()
       
   522 @see RMobileSmartCardEap::ReleaseEapMethod()
       
   523 
       
   524 @capability ReadDeviceData
       
   525 
       
   526 @publishedPartner
       
   527 @released
       
   528 */
       
   529 EXPORT_C void RMobileSmartCardEap::NotifyEapMethodAccessStatusChange(TRequestStatus& aReqStatus, TEapMethodAccessStatus& aEapMethodStatus)
       
   530 	{
       
   531 	__ASSERT_ALWAYS(iMmPtrHolder != NULL, PanicClient(EEtelPanicNullHandle));
       
   532 
       
   533 	TPtr8& ptr1 = iMmPtrHolder->Set(CMobileSmartCardEapPtrHolder::ESlot1NotifyEapMethodAccess, aEapMethodStatus);
       
   534 
       
   535 	Get(EMobileSmartCardEapNotifyEapMethodAccessStatusChange, aReqStatus, ptr1);
       
   536 	}
       
   537 
       
   538 /**
       
   539 Returns whether this RMobileSmartCardEap instance has ownership of its
       
   540 corresponding DF_EAP.
       
   541 
       
   542 @return ETrue only if this instance of RMobileSmartCardEap was the
       
   543         first to call RMobileSmartCardEap::InitialiseEapMethod()
       
   544         successfully.
       
   545 @see RMobileSmartCardEap::InitialiseEapMethod()
       
   546 @see RMobileSmartCardEap::Open()
       
   547 
       
   548 @capability None
       
   549 
       
   550 @publishedPartner
       
   551 @released
       
   552 */
       
   553 EXPORT_C TBool RMobileSmartCardEap::IsEapMethodOwner() const
       
   554 	{
       
   555 	return iOwnsEapMethodLock;
       
   556 	}
       
   557 
       
   558 
       
   559 // helpers //
       
   560 
       
   561 /**
       
   562 Returns the character that corresponds to the value of its parameter
       
   563 (base 17!).
       
   564 
       
   565 @param aDigit an integer between 0 and 16.
       
   566 @return A TChar representing one of '0' to '9' or 'A' to 'G'.
       
   567 
       
   568 @internalComponent
       
   569 @released
       
   570 */
       
   571 TChar RMobileSmartCardEap::SeptChar(TInt aDigit)
       
   572 	{
       
   573 	TChar ret(0);
       
   574 	if ((aDigit < 0) || (aDigit > 16))
       
   575 		{
       
   576 		PanicClient(EEtelPanicHandleNotOpen);
       
   577 		}
       
   578 	else
       
   579 		{
       
   580 		if (aDigit < 10)
       
   581 			{
       
   582 			ret = aDigit + (TUint)'0';
       
   583 			}
       
   584 		else
       
   585 			{
       
   586 			ret = aDigit - 10 + (TUint)'A';
       
   587 			}
       
   588 		}
       
   589 	return ret;
       
   590 	}
       
   591 
       
   592 /**
       
   593 This function is used by RMobileSmartCardEap::Open() to convert the
       
   594 TAID (which is binary data) to a string that can be passed through
       
   595 ETel.  The conversion changes the binary data to a string of
       
   596 hexadecimal semi-octets.
       
   597 
       
   598 @param aBinData Buffer containing the binary data to be converted.
       
   599 @param aText Buffer will contain the text representation of aBinData on
       
   600              return.
       
   601 
       
   602 @see RMobileSmartCardEap::Open()
       
   603 */
       
   604 void RMobileSmartCardEap::ConvertBinToText(const TDesC8& aBinData, TDes& aText)
       
   605 	{
       
   606 	TInt binLength = aBinData.Length();
       
   607 
       
   608 	for (TInt pos = 0; pos < binLength; pos++)
       
   609 		{
       
   610 		_LIT(format, "%02X");
       
   611 		aText.AppendFormat(format, aBinData[pos]);
       
   612 		}
       
   613 	}