terminalsecurity/server/src/TerminalControlSession.cpp
changeset 0 b497e44ab2fc
child 19 86979fe66c4c
equal deleted inserted replaced
-1:000000000000 0:b497e44ab2fc
       
     1 /*
       
     2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description: Implementation of terminalsecurity components
       
    15 *
       
    16 */
       
    17 // TerminalControlSession.cpp
       
    18 //
       
    19 //#define __INCLUDE_CAPABILITY_NAMES__
       
    20 
       
    21 #include <e32svr.h>
       
    22 #include <f32file.h>
       
    23 #include <apgtask.h>
       
    24 
       
    25 #include <rfsClient.h>
       
    26 
       
    27 #include <TerminalControl3rdPartyAPI.h>
       
    28 #include "TerminalControlSession.h"
       
    29 #include "PlatformSecurityPolicies.h"
       
    30 #include "TcTrustedSession.h"
       
    31 //Device encryption utility
       
    32 #include <DevEncEngineConstants.h>
       
    33 #include <DevEncSession.h>
       
    34 //Feature manager
       
    35 #include <featmgr.h>
       
    36 //For debugging purpose
       
    37 #include "debug.h"
       
    38 
       
    39 
       
    40 // ----------------------------------------------------------------------------------------
       
    41 // CTerminalControlSession::CTerminalControlSession
       
    42 // ----------------------------------------------------------------------------------------
       
    43 CTerminalControlSession::CTerminalControlSession()
       
    44 : iContainer(0), iTrustedSessions(0)
       
    45 	{
       
    46 	RDEBUG("CTerminalControlSession::CTerminalControlSession");
       
    47 
       
    48 	}
       
    49 
       
    50 // ----------------------------------------------------------------------------------------
       
    51 // CTerminalControlSession::Server
       
    52 // ----------------------------------------------------------------------------------------
       
    53 CTerminalControlServer& CTerminalControlSession::Server()
       
    54 	{
       
    55 	RDEBUG("CTerminalControlSession::Server");
       
    56 	
       
    57 	return *static_cast<CTerminalControlServer*>(const_cast<CServer2*>(CSession2::Server()));
       
    58 	}
       
    59 
       
    60 // ----------------------------------------------------------------------------------------
       
    61 // CTerminalControlSession::CreateL
       
    62 // 2nd phase construct for sessions - called by the CServer framework
       
    63 // ----------------------------------------------------------------------------------------
       
    64 void CTerminalControlSession::CreateL()
       
    65 	{
       
    66 	RDEBUG("CTerminalControlSession::CreateL");
       
    67 
       
    68 	iTrustedSessions = CObjectIx::NewL();
       
    69 	iContainer = Server().NewContainerL();
       
    70 	Server().AddSession();
       
    71 	}
       
    72 	
       
    73 // ----------------------------------------------------------------------------------------
       
    74 // CTerminalControlSession::~CTerminalControlSession
       
    75 // ----------------------------------------------------------------------------------------
       
    76 CTerminalControlSession::~CTerminalControlSession()
       
    77 	{
       
    78 	RDEBUG("CTerminalControlSession::~CTerminalControlSession");
       
    79 
       
    80 	delete iTrustedSessions;	
       
    81 	Server().DropSession();
       
    82 	}
       
    83 
       
    84 // ----------------------------------------------------------------------------------------
       
    85 // CTerminalControlSession::ServiceL
       
    86 // ----------------------------------------------------------------------------------------
       
    87 void CTerminalControlSession::ServiceL(const RMessage2& aMessage)
       
    88     {
       
    89 	RDEBUG("CTerminalControlSession::ServiceL");
       
    90 
       
    91     TRAPD(err,DispatchMessageL(aMessage));
       
    92 	aMessage.Complete(err);
       
    93     }
       
    94 
       
    95 // ----------------------------------------------------------------------------------------
       
    96 // CTerminalControlSession::DispatchMessageL
       
    97 // ----------------------------------------------------------------------------------------
       
    98 void CTerminalControlSession::DispatchMessageL(const RMessage2& aMessage)
       
    99 	{
       
   100 	RDEBUG_2("CTerminalControlServer::DispatchMessageL; %d", aMessage.Function() );
       
   101 
       
   102     HBufC8*    results = 0;
       
   103     HBufC8*    paramCopy  = 0;
       
   104     HBufC8*    paramCopy2 = 0;
       
   105     TBuf8<MAX_NUMBER_OF_DIGITS_IN_10BASE_INT64> sizeBuf;
       
   106     TInt       value;
       
   107 
       
   108     //
       
   109     // Create new sub session
       
   110     //
       
   111 	switch(aMessage.Function())
       
   112 	    {
       
   113 	        case ECreateSubSession:
       
   114 	        NewTrustedSessionL( aMessage );
       
   115 	        return;
       
   116 	    };
       
   117 
       
   118     //
       
   119     // Get access level from the sub session information
       
   120     // Note: this is where connections without a valid subsession are terminated
       
   121     //
       
   122     CTcTrustedSession* session = TrustedSessionFromHandle( aMessage );
       
   123     if(session == NULL)
       
   124         {
       
   125         // NOTE: This leave happens after client is paniced
       
   126         RDEBUG("CTerminalControlSession::DispatchMessageL() - SESSION NOT TRUSTED - ABORT!");
       
   127         User::Leave( KErrAccessDenied );
       
   128         }
       
   129 
       
   130     TInt accessLevel = session->AccessLevel();
       
   131     TBool hasAllFilesCap = aMessage.HasCapability(ECapabilityAllFiles);
       
   132     TBool hasDiskAdminCap = aMessage.HasCapability(ECapabilityDiskAdmin);
       
   133 
       
   134     //
       
   135     // Disconnecting
       
   136     //
       
   137 	switch(aMessage.Function())
       
   138 	    {
       
   139 	        case ECloseSubSession:
       
   140 	        if(session->iWipeRequested)
       
   141 	            {
       
   142     	        DeleteTrustedSession( aMessage );
       
   143         	    Server().WipeDeviceL();
       
   144 	            }
       
   145 	        else if(session->iRebootRequested)
       
   146 	            {
       
   147     	        DeleteTrustedSession( aMessage );
       
   148         	    Server().RebootDeviceL();
       
   149 	            }
       
   150 	        else
       
   151 	            {
       
   152 	            DeleteTrustedSession( aMessage );
       
   153 	            }
       
   154 	        return;
       
   155 	    };
       
   156 
       
   157 	if((accessLevel == CTcTrustedSession::EAccessLevelNone) && (!hasAllFilesCap))
       
   158         {
       
   159 		RDEBUG("CTerminalControlSession::DispatchMessageL() - SESSION HAS NO ACCESS LEVEL - ABORT!");
       
   160 		User::Leave( KErrAccessDenied );
       
   161         }    
       
   162     //
       
   163     // Message handlers for third party messages
       
   164     //
       
   165     if((((accessLevel & CTcTrustedSession::EAccessLevelApplication) != 0 )&& (hasDiskAdminCap))||(hasAllFilesCap))
       
   166         {
       
   167         switch(aMessage.Function())
       
   168             {
       
   169             case E3rdPartySetterGet:            
       
   170             GetDeviceLockParameterL( aMessage );
       
   171             break;
       
   172 
       
   173             case E3rdPartySetterGetSize:
       
   174             GetDeviceLockParameterSizeL( aMessage );
       
   175             break;
       
   176 
       
   177             case E3rdPartySetterSet:
       
   178             SetDeviceLockParameterL( aMessage );
       
   179             break;
       
   180             }
       
   181         }
       
   182 
       
   183     //
       
   184     // Message handlers for DM adapter
       
   185     //
       
   186     if((accessLevel & CTcTrustedSession::EAccessLevelDMAdapter) != 0)
       
   187         {
       
   188     	switch(aMessage.Function())
       
   189     	    {
       
   190             //-------------------------------------------------------------------------
       
   191 	        case EFileScan:
       
   192                 // Read startup folder
       
   193         	    paramCopy = CopyParameterL( aMessage, 1 );
       
   194         	    CleanupStack::PushL( paramCopy );
       
   195                 session->FileScanL( *paramCopy, (aMessage.Int0() == 1) );
       
   196                 CleanupStack::PopAndDestroy( paramCopy );
       
   197 	        break;
       
   198 
       
   199             //-------------------------------------------------------------------------
       
   200 	        case EFileScanResults:
       
   201 	            results = session->FileScanResultsL();
       
   202 
       
   203                 if( results != NULL)
       
   204                     {
       
   205     	            CleanupStack::PushL( results );
       
   206     	            
       
   207                     TInt size1 = aMessage.GetDesMaxLength(0);
       
   208                     TInt size2 = results->Size();
       
   209                     
       
   210                     if(size1 >= size2)
       
   211                         {
       
   212         	            aMessage.WriteL(0, *results);
       
   213                         }
       
   214                     else
       
   215                         {
       
   216                         User::Leave( KErrArgument );
       
   217                         }
       
   218 
       
   219                     CleanupStack::PopAndDestroy( results );
       
   220                     }
       
   221                 else
       
   222                     {
       
   223                     User::Leave(KErrGeneral);
       
   224                     }
       
   225 	        break;
       
   226 
       
   227             //-------------------------------------------------------------------------
       
   228         	case EFileScanResultsSize:
       
   229 	            results = session->FileScanResultsL();
       
   230         	    
       
   231                 if( results != NULL )
       
   232                     {                    
       
   233                     sizeBuf.Num( results->Size() );
       
   234                     delete results;
       
   235                     }
       
   236                 else
       
   237                     {
       
   238                     sizeBuf.Num(0);
       
   239                     }
       
   240                     
       
   241                 if(aMessage.GetDesMaxLength(0) >= sizeBuf.Length())
       
   242                     {
       
   243     	            aMessage.WriteL(0, sizeBuf);
       
   244                     }
       
   245                 else
       
   246                     {
       
   247                     User::Leave( KErrArgument );
       
   248                     }
       
   249 	        break;
       
   250 
       
   251             //-------------------------------------------------------------------------
       
   252         	case EFileDelete:
       
   253         	    paramCopy = CopyParameterL( aMessage, 0 );
       
   254         	    CleanupStack::PushL( paramCopy );
       
   255         	    Server().DeleteFileL( *paramCopy );
       
   256                 CleanupStack::PopAndDestroy( paramCopy );
       
   257 	        break;
       
   258 
       
   259             //-------------------------------------------------------------------------
       
   260         	case EDeviceLock_AutoLockPeriod_Set:
       
   261         	    value = aMessage.Int0();
       
   262         	    Server().SetLockTimeoutL( value );
       
   263 	        break;
       
   264 
       
   265             //-------------------------------------------------------------------------
       
   266         	case EDeviceLock_AutoLockPeriod_Get:
       
   267                 sizeBuf.Num( Server().GetLockTimeoutL() );
       
   268                 if(aMessage.GetDesMaxLength(0) >= sizeBuf.Length())
       
   269                     {
       
   270     	            aMessage.WriteL(0, sizeBuf);
       
   271                     }
       
   272                 else
       
   273                     {
       
   274                     User::Leave( KErrArgument );
       
   275                     }
       
   276 	        break;
       
   277 
       
   278             //-------------------------------------------------------------------------
       
   279         	case EDeviceLock_MaxAutoLockPeriod_Set:
       
   280         	    value = aMessage.Int0();
       
   281         	    Server().SetLockMaxTimeoutL( value );
       
   282 	        break;
       
   283 
       
   284             //-------------------------------------------------------------------------
       
   285         	case EDeviceLock_MaxAutoLockPeriod_Get:
       
   286                 sizeBuf.Num( Server().GetLockMaxTimeoutL() );                    
       
   287                 if(aMessage.GetDesMaxLength(0) >= sizeBuf.Length())
       
   288                     {
       
   289     	            aMessage.WriteL(0, sizeBuf);
       
   290                     }
       
   291                 else
       
   292                     {
       
   293                     User::Leave( KErrArgument );
       
   294                     }
       
   295 	        break;
       
   296 
       
   297             //-------------------------------------------------------------------------
       
   298         	case EDeviceLock_LockLevel_Set:
       
   299         	    value = aMessage.Int0();
       
   300         	    Server().SetLockLevelL( value );
       
   301 	        break;
       
   302 
       
   303             //-------------------------------------------------------------------------
       
   304         	case EDeviceLock_LockLevel_Get:
       
   305         	    {
       
   306                 sizeBuf.Num( Server().GetLockLevelL() );                    
       
   307                 if(aMessage.GetDesMaxLength(0) >= sizeBuf.Length())
       
   308                     {
       
   309     	            aMessage.WriteL(0, sizeBuf);
       
   310                     }
       
   311                 else
       
   312                     {
       
   313                     User::Leave( KErrArgument );
       
   314                     }
       
   315         	    }
       
   316 	        break;
       
   317 
       
   318             //-------------------------------------------------------------------------
       
   319         	case EDeviceLock_LockCode_Set:
       
   320         	    paramCopy = CopyParameterL( aMessage, 0 );
       
   321         	    CleanupStack::PushL( paramCopy );
       
   322                 Server().SetLockCodeL( *paramCopy );
       
   323                 CleanupStack::PopAndDestroy( paramCopy );
       
   324 	        break;
       
   325 
       
   326             //-------------------------------------------------------------------------
       
   327         	case EDeviceLock_LockCode_Get:
       
   328         		{
       
   329         		RDEBUG("CTerminalControlSession::DispatchMessageL() - GetLockCode not supported - ABORT!");
       
   330         	    User::Leave( KErrNotSupported );
       
   331         		}
       
   332    	        break;
       
   333 
       
   334             //-------------------------------------------------------------------------
       
   335         	case EDeviceWipe:
       
   336         	    // Schedule wipe to when client has been disconnected
       
   337     	        session->iWipeRequested = ETrue;
       
   338 	        break;
       
   339 	        
       
   340 	        
       
   341 	        
       
   342 // ----- enhanced features BEGIN ----------------
       
   343 //#ifdef __SAP_DEVICE_LOCK_ENHANCEMENTS
       
   344 	        
       
   345 	        case EDeviceLock_PasscodeMinLength_Set:
       
   346         	    {
       
   347                 value = aMessage.Int0();
       
   348         	    Server().SetPasscodeMinLengthL( value );
       
   349         	    }
       
   350 	        break;
       
   351 	        
       
   352 	        case EDeviceLock_PasscodeMinLength_Get:
       
   353         	    {
       
   354                 sizeBuf.Num( Server().GetPasscodeMinLengthL() );                    
       
   355                 if( aMessage.GetDesMaxLength( 0 ) >= sizeBuf.Length() )
       
   356                     {
       
   357     	            aMessage.WriteL( 0, sizeBuf );
       
   358                     }
       
   359                 else
       
   360                     {
       
   361                     RDEBUG("Invalid descriptor buffer length!");
       
   362                     User::Leave( KErrArgument );
       
   363                     }
       
   364         	    }
       
   365 	        break;
       
   366 	        
       
   367 	        case EDeviceLock_PasscodeMaxLength_Set:
       
   368         	    {
       
   369                 value = aMessage.Int0();
       
   370         	    Server().SetPasscodeMaxLengthL( value );
       
   371         	    }
       
   372 	        break;
       
   373 	        
       
   374 	        case EDeviceLock_PasscodeMaxLength_Get:
       
   375         	    {
       
   376                 sizeBuf.Num( Server().GetPasscodeMaxLengthL() );                    
       
   377                 if( aMessage.GetDesMaxLength( 0 ) >= sizeBuf.Length() )
       
   378                     {
       
   379     	            aMessage.WriteL( 0, sizeBuf );
       
   380                     }
       
   381                 else
       
   382                     {
       
   383                     RDEBUG("Invalid descriptor buffer length!");
       
   384                     User::Leave( KErrArgument );
       
   385                     }
       
   386         	    }
       
   387 	        break;
       
   388 	        
       
   389 	        case EDeviceLock_PasscodeRequireUpperAndLower_Set:
       
   390         	    {
       
   391                 value = aMessage.Int0();
       
   392         	    Server().SetPasscodeRequireUpperAndLowerL( value );
       
   393         	    }
       
   394 	        break;
       
   395 	        
       
   396 	        case EDeviceLock_PasscodeRequireUpperAndLower_Get:
       
   397         	    {
       
   398                 sizeBuf.Num( Server().GetPasscodeRequireUpperAndLowerL() );                    
       
   399                 if( aMessage.GetDesMaxLength( 0 ) >= sizeBuf.Length() )
       
   400                     {
       
   401     	            aMessage.WriteL( 0, sizeBuf );
       
   402                     }
       
   403                 else
       
   404                     {
       
   405                     RDEBUG("Invalid descriptor buffer length!");
       
   406                     User::Leave( KErrArgument );
       
   407                     }
       
   408         	    }
       
   409 	        break;
       
   410 	        
       
   411 	        case EDeviceLock_PasscodeRequireCharsAndNumbers_Set:
       
   412         	    {
       
   413                 value = aMessage.Int0();
       
   414         	    Server().SetPasscodeRequireCharsAndNumbersL( value );
       
   415         	    }
       
   416 	        break;
       
   417 	        
       
   418 	        case EDeviceLock_PasscodeRequireCharsAndNumbers_Get:
       
   419         	    {
       
   420                 sizeBuf.Num( Server().GetPasscodeRequireCharsAndNumbersL() );                    
       
   421                 if( aMessage.GetDesMaxLength( 0 ) >= sizeBuf.Length() )
       
   422                     {
       
   423     	            aMessage.WriteL( 0, sizeBuf );
       
   424                     }
       
   425                 else
       
   426                     {
       
   427                     RDEBUG("Invalid descriptor buffer length!");
       
   428                     User::Leave( KErrArgument );
       
   429                     }
       
   430         	    }
       
   431 	        break;
       
   432 	        
       
   433 	        case EDeviceLock_PasscodeMaxRepeatedCharacters_Set:
       
   434         	    {
       
   435                 value = aMessage.Int0();
       
   436         	    Server().SetPasscodeMaxRepeatedCharactersL( value );
       
   437         	    }
       
   438 	        break;
       
   439 	        
       
   440 	        case EDeviceLock_PasscodeMaxRepeatedCharacters_Get:
       
   441         	    {
       
   442                 sizeBuf.Num( Server().GetPasscodeMaxRepeatedCharactersL() );                    
       
   443                 if( aMessage.GetDesMaxLength( 0 ) >= sizeBuf.Length() )
       
   444                     {
       
   445     	            aMessage.WriteL( 0, sizeBuf );
       
   446                     }
       
   447                 else
       
   448                     {
       
   449                     RDEBUG("Invalid descriptor buffer length!");
       
   450                     User::Leave( KErrArgument );
       
   451                     }
       
   452         	    }
       
   453 	        break;
       
   454 	        
       
   455 	        case EDeviceLock_PasscodeHistoryBuffer_Set:
       
   456         	    {
       
   457                 value = aMessage.Int0();
       
   458         	    Server().SetPasscodeHistoryBufferL( value );
       
   459         	    }
       
   460 	        break;
       
   461 	        
       
   462 	        case EDeviceLock_PasscodeHistoryBuffer_Get:
       
   463         	    {
       
   464                 sizeBuf.Num( Server().GetPasscodeHistoryBufferL() );                    
       
   465                 if( aMessage.GetDesMaxLength( 0 ) >= sizeBuf.Length() )
       
   466                     {
       
   467     	            aMessage.WriteL( 0, sizeBuf );
       
   468                     }
       
   469                 else
       
   470                     {
       
   471                     RDEBUG("Invalid descriptor buffer length!");
       
   472                     User::Leave( KErrArgument );
       
   473                     }
       
   474         	    }
       
   475 	        break;
       
   476 	        
       
   477 	        case EDeviceLock_PasscodeExpiration_Set:
       
   478         	    {
       
   479                 value = aMessage.Int0();
       
   480         	    Server().SetPasscodeExpirationL( value );
       
   481         	    }
       
   482 	        break;
       
   483 	        
       
   484 	        case EDeviceLock_PasscodeExpiration_Get:
       
   485         	    {
       
   486                 sizeBuf.Num( Server().GetPasscodeExpirationL() );                    
       
   487                 if( aMessage.GetDesMaxLength( 0 ) >= sizeBuf.Length() )
       
   488                     {
       
   489     	            aMessage.WriteL( 0, sizeBuf );
       
   490                     }
       
   491                 else
       
   492                     {
       
   493                     RDEBUG("Invalid descriptor buffer length!");
       
   494                     User::Leave( KErrArgument );
       
   495                     }
       
   496         	    }
       
   497 	        break;
       
   498 	        
       
   499 	        case EDeviceLock_PasscodeMinChangeTolerance_Set:
       
   500         	    {
       
   501                 value = aMessage.Int0();
       
   502         	    Server().SetPasscodeMinChangeToleranceL( value );
       
   503         	    }
       
   504 	        break;
       
   505 	        
       
   506 	        case EDeviceLock_PasscodeMinChangeTolerance_Get:
       
   507         	    {
       
   508                 sizeBuf.Num( Server().GetPasscodeMinChangeToleranceL() );                    
       
   509                 if( aMessage.GetDesMaxLength( 0 ) >= sizeBuf.Length() )
       
   510                     {
       
   511     	            aMessage.WriteL( 0, sizeBuf );
       
   512                     }
       
   513                 else
       
   514                     {
       
   515                     RDEBUG("Invalid descriptor buffer length!");
       
   516                     User::Leave( KErrArgument );
       
   517                     }
       
   518         	    }
       
   519 	        break;
       
   520 	        
       
   521 	        case EDeviceLock_PasscodeMinChangeInterval_Set:
       
   522         	    {
       
   523                 value = aMessage.Int0();
       
   524         	    Server().SetPasscodeMinChangeIntervalL( value );
       
   525         	    }
       
   526 	        break;
       
   527 	        
       
   528 	        case EDeviceLock_PasscodeMinChangeInterval_Get:
       
   529         	    {
       
   530                 sizeBuf.Num( Server().GetPasscodeMinChangeIntervalL() );                    
       
   531                 if( aMessage.GetDesMaxLength( 0 ) >= sizeBuf.Length() )
       
   532                     {
       
   533     	            aMessage.WriteL( 0, sizeBuf );
       
   534                     }
       
   535                 else
       
   536                     {
       
   537                     RDEBUG("Invalid descriptor buffer length!");
       
   538                     User::Leave( KErrArgument );
       
   539                     }
       
   540         	    }
       
   541 	        break;
       
   542 	        
       
   543 	        case EDeviceLock_PasscodeCheckSpecificStrings_Set:
       
   544         	    {
       
   545                 value = aMessage.Int0();
       
   546         	    Server().SetPasscodeCheckSpecificStringsL( value );
       
   547         	    }
       
   548 	        break;
       
   549 	        
       
   550 	        case EDeviceLock_PasscodeCheckSpecificStrings_Get:
       
   551         	    {
       
   552                 sizeBuf.Num( Server().GetPasscodeCheckSpecificStringsL() );                    
       
   553                 if( aMessage.GetDesMaxLength( 0 ) >= sizeBuf.Length() )
       
   554                     {
       
   555     	            aMessage.WriteL( 0, sizeBuf );
       
   556                     }
       
   557                 else
       
   558                     {
       
   559                     RDEBUG("Invalid descriptor buffer length!");
       
   560                     User::Leave( KErrArgument );
       
   561                     }
       
   562         	    }
       
   563 	        break;
       
   564 	        
       
   565 	        case EDeviceLock_PasscodeDisallowSpecific:
       
   566         	    {
       
   567 				paramCopy = CopyParameterL( aMessage, 0 );
       
   568         	    CleanupStack::PushL( paramCopy );
       
   569         	    Server().DisallowSpecificPasscodesL( *paramCopy );
       
   570                 CleanupStack::PopAndDestroy( paramCopy );    
       
   571                 paramCopy = NULL;            
       
   572         	    }
       
   573 	        break;
       
   574 	        
       
   575 	        case EDeviceLock_PasscodeAllowSpecific:
       
   576         	    {
       
   577                 paramCopy = CopyParameterL( aMessage, 0 );
       
   578         	    CleanupStack::PushL( paramCopy );
       
   579         	    Server().AllowSpecificPasscodesL( *paramCopy );
       
   580                 CleanupStack::PopAndDestroy( paramCopy );    
       
   581                 paramCopy = NULL; 
       
   582         	    }
       
   583 	        break;
       
   584 	        
       
   585 	        case EDeviceLock_PasscodeClearSpecificStrings:
       
   586         	    {
       
   587                 Server().ClearSpecificPasscodeStringsL();
       
   588         	    }
       
   589 	        break;
       
   590 	        
       
   591 	        case EDeviceLock_PasscodeMaxAttempts_Set:
       
   592         	    {
       
   593                 value = aMessage.Int0();
       
   594         	    Server().SetPasscodeMaxAttemptsL( value );
       
   595         	    }
       
   596 	        break;
       
   597 	        
       
   598 	        case EDeviceLock_PasscodeMaxAttempts_Get:
       
   599         	    {
       
   600                 sizeBuf.Num( Server().GetPasscodeMaxAttemptsL() );                    
       
   601                 if( aMessage.GetDesMaxLength( 0 ) >= sizeBuf.Length() )
       
   602                     {
       
   603     	            aMessage.WriteL( 0, sizeBuf );
       
   604                     }
       
   605                 else
       
   606                     {
       
   607                     RDEBUG("Invalid descriptor buffer length!");
       
   608                     User::Leave( KErrArgument );
       
   609                     }
       
   610         	    }
       
   611 	        break;	
       
   612 	        
       
   613 	        case EDeviceLock_PasscodeConsecutiveNumbers_Set:
       
   614         	    {
       
   615                 value = aMessage.Int0();
       
   616         	    Server().SetConsecutiveNumbersL( value );
       
   617         	    }
       
   618 	        break;
       
   619 	        
       
   620 	        case EDeviceLock_PasscodeConsecutiveNumbers_Get:
       
   621         	    {
       
   622                 sizeBuf.Num( Server().GetConsecutiveNumbersL() );                    
       
   623                 if( aMessage.GetDesMaxLength( 0 ) >= sizeBuf.Length() )
       
   624                     {
       
   625     	            aMessage.WriteL( 0, sizeBuf );
       
   626                     }
       
   627                 else
       
   628                     {
       
   629                     RDEBUG("Invalid descriptor buffer length!");
       
   630                     User::Leave( KErrArgument );
       
   631                     }
       
   632         	    }
       
   633 	        break;        
       
   634 
       
   635             case EDeviceLock_PasscodeMinSpecialCharacters_Set:
       
   636                 {
       
   637                 value = aMessage.Int0();
       
   638                 Server().SetPasscodeMinSpecialCharactersL( value );
       
   639                 }
       
   640             break;
       
   641             
       
   642             case EDeviceLock_PasscodeMinSpecialCharacters_Get:
       
   643                 {
       
   644                 sizeBuf.Num( Server().GetPasscodeMinSpecialCharactersL() );                    
       
   645                 if( aMessage.GetDesMaxLength( 0 ) >= sizeBuf.Length() )
       
   646                     {
       
   647                     aMessage.WriteL( 0, sizeBuf );
       
   648                     }
       
   649                 else
       
   650                     {
       
   651                     RDEBUG("Invalid descriptor buffer length!");
       
   652                     User::Leave( KErrArgument );
       
   653                     }
       
   654                 }
       
   655             break;
       
   656             
       
   657             case EDeviceLock_PasscodeDisallowSimple_Set:
       
   658                 {
       
   659                 value = aMessage.Int0();
       
   660                 Server().SetDisallowSimpleL( value );
       
   661                 }
       
   662             break;
       
   663             case EDeviceLock_PasscodeDisallowSimple_Get:
       
   664                 {
       
   665                 sizeBuf.Num( Server().GetDisallowSimpleL() );                    
       
   666                 if( aMessage.GetDesMaxLength( 0 ) >= sizeBuf.Length() )
       
   667                     {
       
   668                     aMessage.WriteL( 0, sizeBuf );
       
   669                     }
       
   670                 else
       
   671                     {
       
   672                     RDEBUG("Invalid descriptor buffer length!");
       
   673                     User::Leave( KErrArgument );
       
   674                     }
       
   675                 }
       
   676             break;        
       
   677 	        
       
   678 // ----- enhanced features END ----------------
       
   679 //#endif	        
       
   680 	        
       
   681 	        
       
   682 	        
       
   683 
       
   684             //-------------------------------------------------------------------------
       
   685         	case EProcesses:
       
   686         	    {
       
   687                 /*if( session->iProcessList == NULL )
       
   688                     {
       
   689                     // Note: This should not happen since process list size may vary
       
   690                     // Process list is updated when size is queried
       
   691                     delete session->iProcessList; session->iProcessList = 0;
       
   692         	        session->iProcessList = Server().GetRunningProcessesL();
       
   693                     }*/
       
   694 
       
   695                 if( session->iProcessList != NULL )
       
   696                     {
       
   697                     TInt size1 = aMessage.GetDesMaxLength(0);
       
   698                     TInt size2 = session->iProcessList->Size();
       
   699                     if(size1 >= size2)
       
   700                         {
       
   701         	            aMessage.WriteL(0, session->iProcessList->Ptr(0));
       
   702                         }
       
   703                     else
       
   704                         {
       
   705                         
       
   706                         User::Leave(KErrGeneral);
       
   707                         }
       
   708                     }
       
   709                 else
       
   710                     {
       
   711                     RDEBUG("Process list is NULL");
       
   712                     User::Leave(KErrGeneral);
       
   713                     }
       
   714         	    }        	
       
   715 	        break;
       
   716 
       
   717             //-------------------------------------------------------------------------
       
   718 	        case EProcessesSize:
       
   719 	            {
       
   720     	        // NOTE: Processes are listed only in this function
       
   721     	        // Process list size may change in each listing
       
   722     	        delete session->iProcessList; session->iProcessList = 0;
       
   723     	        session->iProcessList = Server().GetRunningProcessesL();
       
   724 
       
   725     	        // Get size in buffer    	        
       
   726                 if( session->iProcessList != NULL )
       
   727                     {                    
       
   728                     sizeBuf.Num( session->iProcessList->Size() );
       
   729                     }
       
   730                 else
       
   731                     {
       
   732                     sizeBuf.Num(0);
       
   733                     }
       
   734 
       
   735                 // Return size
       
   736     	        if(aMessage.GetDesMaxLength(0) >= sizeBuf.Length())
       
   737                     {
       
   738     	            aMessage.WriteL(0, sizeBuf);
       
   739                     }
       
   740                 else
       
   741                     {
       
   742                     RDEBUG("Invalid descriptor buffer length!");
       
   743                     User::Leave( KErrArgument );
       
   744                     }
       
   745 	            }
       
   746 	        break;
       
   747 
       
   748             //-------------------------------------------------------------------------
       
   749         	case EProcessData:
       
   750         	    paramCopy  = CopyParameterL( aMessage, 0 );
       
   751         	    CleanupStack::PushL( paramCopy );
       
   752         	    paramCopy2 = CopyParameterL( aMessage, 1 );
       
   753         	    CleanupStack::PushL( paramCopy2 );
       
   754 
       
   755                 if( session->iProcessList == NULL )
       
   756                     {
       
   757                     // Note: Process list may have changed since last listing...
       
   758                     // If there is a previous list, we don't want to update it.
       
   759                     delete session->iProcessList; session->iProcessList = 0;
       
   760         	        session->iProcessList = Server().GetRunningProcessesL();
       
   761                     }
       
   762 
       
   763                 delete session->iProcessData; session->iProcessData = 0;
       
   764         	    session->iProcessData = Server().GetProcessDataL(*paramCopy, *paramCopy2);
       
   765         	    
       
   766                 if( session->iProcessData != NULL )
       
   767                     {
       
   768                     TInt size1 = aMessage.GetDesMaxLength(2);
       
   769                     TInt size2 = session->iProcessData->Size();
       
   770                     if(size1 >= size2)
       
   771                         {
       
   772         	            aMessage.WriteL(2, session->iProcessData->Ptr(0));
       
   773                         }
       
   774                     else
       
   775                         {
       
   776                         RDEBUG("Invalid descriptor buffer length!");
       
   777                         User::Leave( KErrArgument );
       
   778                         }
       
   779                     }
       
   780                 else
       
   781                     {
       
   782                     RDEBUG("process data is NULL");
       
   783                     User::Leave(KErrGeneral);
       
   784                     }        	    
       
   785 
       
   786                 CleanupStack::PopAndDestroy( paramCopy2 );
       
   787                 CleanupStack::PopAndDestroy( paramCopy );
       
   788 	        break;
       
   789         	
       
   790             //-------------------------------------------------------------------------
       
   791         	case EReboot:
       
   792         	    // Schedule reboot to when client has been disconnected
       
   793         	    value = aMessage.Int0();
       
   794         	    if( value == 0 )
       
   795         	        {
       
   796                     session->iRebootRequested = EFalse;
       
   797         	        }
       
   798         	    else
       
   799         	        {
       
   800         	        session->iRebootRequested = ETrue;
       
   801         	        }
       
   802 	        break;
       
   803         	
       
   804             //-------------------------------------------------------------------------
       
   805         	case ELocalOperation_Start:
       
   806         	    paramCopy  = CopyParameterL( aMessage, 0 );        	    
       
   807         	    value = aMessage.Int1();
       
   808         	    CleanupStack::PushL( paramCopy );
       
   809         	    if(value == 1)
       
   810         	        {
       
   811                     Server().StartProcessByUidL( *paramCopy );
       
   812         	        }
       
   813         	    else
       
   814         	        {
       
   815         	        Server().StartProcessByFullNameL( *paramCopy );
       
   816         	        }
       
   817                 CleanupStack::PopAndDestroy( paramCopy );
       
   818 	        break;
       
   819         
       
   820             //-------------------------------------------------------------------------
       
   821         	case ELocalOperation_Stop:
       
   822         	    paramCopy  = CopyParameterL( aMessage, 0 );
       
   823         	    value = aMessage.Int1();
       
   824         	    CleanupStack::PushL( paramCopy );
       
   825         	    if(value == 1)
       
   826         	        {
       
   827                     Server().StopProcessByUidL( *paramCopy );
       
   828         	        }
       
   829         	    else
       
   830         	        {
       
   831                     Server().StopProcessByFullNameL( *paramCopy );
       
   832         	        }
       
   833                 CleanupStack::PopAndDestroy( paramCopy );
       
   834 	        break;
       
   835 	        
       
   836 	        default:
       
   837 	        	{
       
   838 	        	RDEBUG("CTerminalControlSession::DispatchMessageL() - DM Adapter - ERROR - KErrNotSupported");
       
   839 	        	User::Leave( KErrNotSupported );	
       
   840 	        	}
       
   841 	        break;
       
   842 	        
       
   843     	    }
       
   844         }
       
   845     }
       
   846 
       
   847 // ----------------------------------------------------------------------------------------
       
   848 // CTerminalControlSession::NewTrustedSessionL
       
   849 // Create a new counter; pass back its handle via the message
       
   850 // ----------------------------------------------------------------------------------------
       
   851 void CTerminalControlSession::NewTrustedSessionL( const RMessage2& aMessage)
       
   852 	{
       
   853 	RDEBUG("CTerminalControlSession::NewTrustedSessionL");
       
   854 
       
   855 	TInt param0Size = aMessage.GetDesLength(0);
       
   856 	TInt certSize = sizeof(TCertInfo);
       
   857 	TBool hasCert = ( param0Size == certSize );
       
   858 
       
   859 	TCertInfo cert;
       
   860 	TPckg<TCertInfo> certp( cert );
       
   861 	certp.FillZ();
       
   862 
       
   863 	if( hasCert )
       
   864 	    {
       
   865     	RDEBUG("CTerminalControlSession::NewTrustedSessionL Session has a certificate");
       
   866 	    aMessage.Read(0, certp);
       
   867 	    }
       
   868 	else
       
   869 	    {
       
   870     	RDEBUG("CTerminalControlSession::NewTrustedSessionL Warning: Session does not have a certificate");
       
   871 	    }
       
   872 
       
   873     //
       
   874 	// Add new CTcTrustedSession object into container and object index
       
   875 	//
       
   876 	TSecureId secureID = aMessage.SecureId();
       
   877 
       
   878 	CTcTrustedSession* trustedSession = 0;
       
   879 
       
   880     if( hasCert )
       
   881         {
       
   882     	trustedSession = CTcTrustedSession::NewL( secureID, cert );
       
   883         }
       
   884     else
       
   885         {
       
   886         trustedSession = CTcTrustedSession::NewL( secureID );
       
   887         }
       
   888 
       
   889 	if(trustedSession == 0)
       
   890 	    {
       
   891 	    PanicClient( aMessage, EBadDescriptor);
       
   892 	    }
       
   893       else
       
   894       {
       
   895     	iContainer->AddL( trustedSession );
       
   896     	TInt handle = iTrustedSessions->AddL( trustedSession );
       
   897 
       
   898     	// Send handle to client
       
   899     	TPckg<TInt> handlePckg( handle );
       
   900     	TInt checkValue = handlePckg();
       
   901     	TRAPD( r, aMessage.WriteL(3, handlePckg))
       
   902 
       
   903     	RDEBUG_2("CTerminalControlSession::NewTrustedSessionL: %d", handle );
       
   904 
       
   905       if ( r != KErrNone)
       
   906         {
       
   907         iTrustedSessions->Remove(handle);
       
   908         PanicClient( aMessage, EBadDescriptor);
       
   909         return;
       
   910         }
       
   911 
       
   912     	iSubsessionCount++;
       
   913       }
       
   914 	}
       
   915 
       
   916 // ----------------------------------------------------------------------------------------
       
   917 // CTerminalControlSession::TrustedSessionFromHandle
       
   918 // ----------------------------------------------------------------------------------------
       
   919 CTcTrustedSession* CTerminalControlSession::TrustedSessionFromHandle( const RMessage2& aMessage)
       
   920     {
       
   921 	RDEBUG_2("CTerminalControlSession::TrustedSessionFromHandle: %d", aMessage.Int3() );
       
   922     
       
   923 	CTcTrustedSession* trustedSession = (CTcTrustedSession*)iTrustedSessions->At(aMessage.Int3());
       
   924 	if (trustedSession == NULL)
       
   925 		PanicClient( aMessage, EBadSubsessionHandle); 
       
   926 	return trustedSession;
       
   927     }
       
   928 
       
   929 // ----------------------------------------------------------------------------------------
       
   930 // CTerminalControlSession::DeleteTrustedSession
       
   931 // ----------------------------------------------------------------------------------------
       
   932 void CTerminalControlSession::DeleteTrustedSession( const RMessage2& aMessage)
       
   933     {
       
   934 	RDEBUG_2("CTerminalControlSession::DeleteTrustedSession: %d", aMessage.Int3() );
       
   935 
       
   936 
       
   937 	CTcTrustedSession* trustedSession = (CTcTrustedSession*)iTrustedSessions->At(aMessage.Int3());
       
   938 	
       
   939 	//if (trustedSession == NULL)
       
   940     //    PanicClient( aMessage, EBadSubsessionHandle); 
       
   941 
       
   942 	iTrustedSessions->Remove(aMessage.Int3());		
       
   943 
       
   944 	// delete trustedSession is not needed
       
   945 
       
   946 	iSubsessionCount--;
       
   947     }
       
   948 
       
   949 // ----------------------------------------------------------------------------------------
       
   950 // CTerminalControlSession::ServiceError
       
   951 // Handle an error from CHelloWorldSession::ServiceL()
       
   952 // ----------------------------------------------------------------------------------------
       
   953 void CTerminalControlSession::ServiceError(const RMessage2& aMessage,TInt aError)
       
   954 	{
       
   955 	RDEBUG_2("TerminalControlServer: CTerminalControlSession::ServiceError %d", aError);
       
   956 
       
   957 	CSession2::ServiceError(aMessage,aError);
       
   958 	}
       
   959 
       
   960 // ----------------------------------------------------------------------------------------
       
   961 // CTerminalControlSession::SetDeviceLockParameterL
       
   962 // ----------------------------------------------------------------------------------------
       
   963 TInt CTerminalControlSession::SetDeviceLockParameterL(const RMessage2 &aMessage)
       
   964     {
       
   965 	RDEBUG_2("CTerminalControlSession::SetDeviceLockParameterL: %d", aMessage.Int0());
       
   966 
       
   967     TInt        status      = KErrNone;
       
   968     TInt        type        = aMessage.Int0();
       
   969     HBufC8*     data        = CopyParameterL(aMessage, 1);
       
   970     TPtr8       ptr         (data->Des());
       
   971     TInt        value       = 0;
       
   972     TLex8       lex;
       
   973 
       
   974     CleanupStack::PushL( data );
       
   975 
       
   976     //Check if the device memory is encrypted or not.
       
   977     TBool encryptionEnabled = IsDeviceMemoryEncrypted();
       
   978     
       
   979     switch(type)
       
   980         {
       
   981         case RTerminalControl3rdPartySession::ETimeout:
       
   982             lex.Assign( *data );
       
   983     	    User::LeaveIfError( lex.Val( value ) );
       
   984             if ( 0 == value )
       
   985                 {
       
   986                 if ( encryptionEnabled )
       
   987                     {
       
   988                     //If drive memory is encrypted, do not set the value
       
   989                     User::Leave( KErrPermissionDenied );
       
   990                     }
       
   991                 }
       
   992     	    Server().SetLockTimeoutL( value );
       
   993         break;
       
   994 
       
   995         case RTerminalControl3rdPartySession::EMaxTimeout:
       
   996             RDEBUG_2("Value of max timeout is %d", value);
       
   997             lex.Assign( *data );
       
   998     	    User::LeaveIfError( lex.Val( value ) );
       
   999 
       
  1000             if ( encryptionEnabled )
       
  1001                 {
       
  1002                 RDEBUG("Memory is encrypted");
       
  1003                 if ((0 == value) || value > KMaxAutolockPeriod)
       
  1004                     {
       
  1005                     RDEBUG_2("Denying setting of max auto lock as value is %d", value);
       
  1006                     User::Leave( KErrPermissionDenied );
       
  1007                     }
       
  1008                 }
       
  1009             else
       
  1010                 {
       
  1011                 RDEBUG("Memory is decrypted");
       
  1012                 }
       
  1013     	    Server().SetLockMaxTimeoutL( value );
       
  1014         break;
       
  1015 
       
  1016         case RTerminalControl3rdPartySession::EPasscode:
       
  1017             Server().SetLockCodeL( *data );
       
  1018         break;
       
  1019 
       
  1020         case RTerminalControl3rdPartySession::EPasscodePolicy:
       
  1021             lex.Assign( *data );
       
  1022     	    User::LeaveIfError( lex.Val( value ) );
       
  1023             Server().SetPasscodePolicyL( value );
       
  1024         break;
       
  1025 
       
  1026         case RTerminalControl3rdPartySession::ELock:
       
  1027             lex.Assign( *data );
       
  1028             User::LeaveIfError( lex.Val( value ) );
       
  1029             RDEBUG_2("RTerminalControl3rdPartySession::ELock: %d", value );
       
  1030             Server().SetLockLevelL( value );
       
  1031         break;
       
  1032 
       
  1033         case RTerminalControl3rdPartySession::EDeviceWipe:
       
  1034             if(data->Des() != _L8("0"))
       
  1035                 {
       
  1036                 Server().WipeDeviceL();
       
  1037                 }
       
  1038         break;
       
  1039 
       
  1040 // ----- enhanced features BEGIN ----------------
       
  1041 //#ifdef __SAP_DEVICE_LOCK_ENHANCEMENTS
       
  1042 
       
  1043        	case RTerminalControl3rdPartySession::EPasscodeMinLength:
       
  1044        		{
       
  1045        		lex.Assign( *data );
       
  1046     	    User::LeaveIfError( lex.Val( value ) );
       
  1047     	    Server().SetPasscodeMinLengthL( value );
       
  1048        		}
       
  1049        	break;
       
  1050        	
       
  1051        	case RTerminalControl3rdPartySession::EPasscodeMaxLength:
       
  1052        		{
       
  1053        		lex.Assign( *data );
       
  1054     	    User::LeaveIfError( lex.Val( value ) );
       
  1055     	    Server().SetPasscodeMaxLengthL( value );
       
  1056        		}
       
  1057        	break;
       
  1058 
       
  1059 		case RTerminalControl3rdPartySession::EPasscodeRequireUpperAndLower:
       
  1060        		{
       
  1061        		lex.Assign( *data );
       
  1062     	    User::LeaveIfError( lex.Val( value ) );
       
  1063     	    Server().SetPasscodeRequireUpperAndLowerL( value );
       
  1064        		}
       
  1065        	break;
       
  1066        	
       
  1067        	case RTerminalControl3rdPartySession::EPasscodeRequireCharsAndNumbers:
       
  1068        		{
       
  1069        		lex.Assign( *data );
       
  1070     	    User::LeaveIfError( lex.Val( value ) );
       
  1071     	    Server().SetPasscodeRequireCharsAndNumbersL( value );
       
  1072        		}
       
  1073        	break;
       
  1074        	
       
  1075        	case RTerminalControl3rdPartySession::EPasscodeMaxRepeatedCharacters:
       
  1076        		{
       
  1077        		lex.Assign( *data );
       
  1078     	    User::LeaveIfError( lex.Val( value ) );
       
  1079     	    Server().SetPasscodeMaxRepeatedCharactersL( value );
       
  1080        		}
       
  1081        	break;
       
  1082        	
       
  1083        	case RTerminalControl3rdPartySession::EPasscodeHistoryBuffer:
       
  1084        		{
       
  1085        		lex.Assign( *data );
       
  1086     	    User::LeaveIfError( lex.Val( value ) );
       
  1087     	    Server().SetPasscodeHistoryBufferL( value );
       
  1088        		}
       
  1089        	break;
       
  1090        	
       
  1091        	case RTerminalControl3rdPartySession::EPasscodeExpiration:
       
  1092        		{
       
  1093        		lex.Assign( *data );
       
  1094     	    User::LeaveIfError( lex.Val( value ) );
       
  1095     	    Server().SetPasscodeExpirationL( value );
       
  1096        		}
       
  1097        	break;
       
  1098        	
       
  1099        	case RTerminalControl3rdPartySession::EPasscodeMinChangeTolerance:
       
  1100        		{
       
  1101        		lex.Assign( *data );
       
  1102     	    User::LeaveIfError( lex.Val( value ) );
       
  1103     	    Server().SetPasscodeMinChangeToleranceL( value );
       
  1104        		}
       
  1105        	break;
       
  1106        	
       
  1107        	case RTerminalControl3rdPartySession::EPasscodeMinChangeInterval:
       
  1108        		{
       
  1109        		lex.Assign( *data );
       
  1110     	    User::LeaveIfError( lex.Val( value ) );
       
  1111     	    Server().SetPasscodeMinChangeIntervalL( value );
       
  1112        		}
       
  1113        	break;
       
  1114        	
       
  1115        	case RTerminalControl3rdPartySession::EPasscodeCheckSpecificStrings:
       
  1116        		{
       
  1117        		lex.Assign( *data );
       
  1118     	    User::LeaveIfError( lex.Val( value ) );
       
  1119     	    Server().SetPasscodeCheckSpecificStringsL( value );
       
  1120        		}
       
  1121        	break;
       
  1122        	
       
  1123        	case RTerminalControl3rdPartySession::EPasscodeDisallowSpecific:
       
  1124        		{
       
  1125        		Server().DisallowSpecificPasscodesL( *data );
       
  1126        		}
       
  1127        	break;
       
  1128        	
       
  1129        	case RTerminalControl3rdPartySession::EPasscodeAllowSpecific:
       
  1130        		{
       
  1131        		Server().AllowSpecificPasscodesL( *data );
       
  1132        		}
       
  1133        	break;
       
  1134        	
       
  1135        	case RTerminalControl3rdPartySession::EPasscodeClearSpecificStrings:
       
  1136        		{
       
  1137     	    Server().ClearSpecificPasscodeStringsL();
       
  1138        		}
       
  1139        	break;
       
  1140        	
       
  1141        	case RTerminalControl3rdPartySession::EPasscodeMaxAttempts:
       
  1142        		{
       
  1143        		lex.Assign( *data );
       
  1144     	    User::LeaveIfError( lex.Val( value ) );
       
  1145     	    Server().SetPasscodeMaxAttemptsL( value );
       
  1146        		}
       
  1147        	break;
       
  1148        	
       
  1149        	case RTerminalControl3rdPartySession::EPasscodeConsecutiveNumbers:
       
  1150        		{
       
  1151        		lex.Assign( *data );
       
  1152     	    User::LeaveIfError( lex.Val( value ) );
       
  1153     	    Server().SetConsecutiveNumbersL( value );
       
  1154        		}
       
  1155        	break;
       
  1156 
       
  1157         case RTerminalControl3rdPartySession::EPasscodeMinSpecialCharacters:
       
  1158             {
       
  1159             lex.Assign( *data );
       
  1160             User::LeaveIfError( lex.Val( value ) );
       
  1161             Server().SetPasscodeMinSpecialCharactersL( value );
       
  1162             }
       
  1163         break;
       
  1164         case RTerminalControl3rdPartySession::EPasscodeDisallowSimple:
       
  1165             {
       
  1166             lex.Assign( *data );
       
  1167             User::LeaveIfError( lex.Val( value ) );
       
  1168             Server().SetDisallowSimpleL( value );
       
  1169             }
       
  1170         break;
       
  1171         
       
  1172 //#endif
       
  1173 // ----- enhanced features END ----------------
       
  1174        	
       
  1175         default:
       
  1176         	{
       
  1177         	RDEBUG("CTerminalControlSession::SetDeviceLockParameterL() - 3rd party - ERROR - KErrNotSupported");
       
  1178             User::Leave( KErrNotSupported );
       
  1179         	}
       
  1180         break;        
       
  1181 
       
  1182         }
       
  1183 
       
  1184     CleanupStack::PopAndDestroy( data );
       
  1185 
       
  1186     return status;
       
  1187     }
       
  1188 
       
  1189 // ----------------------------------------------------------------------------------------
       
  1190 // CTerminalControlSession::GetDeviceLockParameterSizeL
       
  1191 // ----------------------------------------------------------------------------------------
       
  1192 TInt CTerminalControlSession::GetDeviceLockParameterSizeL(const RMessage2 &aMessage)
       
  1193     {
       
  1194 	RDEBUG_2("CTerminalControlSession::GetDeviceLockParameterSizeL: %d", aMessage.Int0() );
       
  1195     
       
  1196     TBuf8<MAX_NUMBER_OF_DIGITS_IN_10BASE_INT64> sizeBuf;
       
  1197     TBuf8<MAX_NUMBER_OF_DIGITS_IN_10BASE_INT64> sizeBuf2;
       
  1198     TInt type = aMessage.Int0();
       
  1199 
       
  1200     GetDeviceLockParameterL( sizeBuf, type );
       
  1201     sizeBuf2.Num(sizeBuf.Length());
       
  1202 
       
  1203     if(aMessage.GetDesMaxLength(1) >= sizeBuf2.Length())
       
  1204         {
       
  1205         aMessage.WriteL(1, sizeBuf2);
       
  1206         }
       
  1207     else
       
  1208         {
       
  1209         User::Leave(KErrGeneral);
       
  1210         }
       
  1211 
       
  1212     return KErrNone;
       
  1213     }
       
  1214 
       
  1215 // ----------------------------------------------------------------------------------------
       
  1216 // CTerminalControlSession::GetDeviceLockParameterL
       
  1217 // ----------------------------------------------------------------------------------------
       
  1218 TInt CTerminalControlSession::GetDeviceLockParameterL(const RMessage2 &aMessage)
       
  1219     {
       
  1220 	RDEBUG_2("CTerminalControlSession::GetDeviceLockParameterL: %d", aMessage.Int0() );
       
  1221 
       
  1222     TBuf8<MAX_NUMBER_OF_DIGITS_IN_10BASE_INT64> sizeBuf;
       
  1223     TInt        status      = KErrNone;
       
  1224     TInt        type        = aMessage.Int0();
       
  1225 
       
  1226     GetDeviceLockParameterL( sizeBuf, type );
       
  1227 
       
  1228     if(aMessage.GetDesMaxLength(1) >= sizeBuf.Length())
       
  1229         {
       
  1230         aMessage.WriteL(1, sizeBuf);
       
  1231         }
       
  1232     else
       
  1233         {
       
  1234         User::Leave(KErrGeneral);
       
  1235         }
       
  1236 
       
  1237     return status;
       
  1238     }
       
  1239 
       
  1240 // ----------------------------------------------------------------------------------------
       
  1241 // CTerminalControlSession::GetDeviceLockParameterL
       
  1242 // ----------------------------------------------------------------------------------------
       
  1243 void CTerminalControlSession::GetDeviceLockParameterL(TBuf8<MAX_NUMBER_OF_DIGITS_IN_10BASE_INT64> &sizeBuf, TInt aType)
       
  1244     {
       
  1245 	RDEBUG_2("CTerminalControlSession::GetDeviceLockParameterL2: %d", aType );
       
  1246 
       
  1247     switch(aType)
       
  1248         {
       
  1249         case RTerminalControl3rdPartySession::ETimeout:
       
  1250             sizeBuf.Num( Server().GetLockTimeoutL() );
       
  1251         break;
       
  1252 
       
  1253         case RTerminalControl3rdPartySession::EMaxTimeout:
       
  1254             sizeBuf.Num( Server().GetLockMaxTimeoutL() );
       
  1255         break;
       
  1256 
       
  1257         case RTerminalControl3rdPartySession::EPasscode:
       
  1258             User::Leave( KErrNotSupported );        
       
  1259         break;
       
  1260 
       
  1261         case RTerminalControl3rdPartySession::EPasscodePolicy:
       
  1262             sizeBuf.Num( Server().GetPasscodePolicyL() );
       
  1263         break;
       
  1264 
       
  1265         case RTerminalControl3rdPartySession::ELock:
       
  1266             User::Leave( KErrNotSupported );        
       
  1267         break;
       
  1268         
       
  1269 // ----- enhanced features BEGIN ----------------
       
  1270 //#ifdef __SAP_DEVICE_LOCK_ENHANCEMENTS        
       
  1271 
       
  1272         case RTerminalControl3rdPartySession::EPasscodeMinLength:
       
  1273        		{
       
  1274     	    sizeBuf.Num( Server().GetPasscodeMinLengthL() );
       
  1275        		}
       
  1276        	break;
       
  1277        	
       
  1278        	case RTerminalControl3rdPartySession::EPasscodeMaxLength:
       
  1279        		{
       
  1280     	    sizeBuf.Num( Server().GetPasscodeMaxLengthL() );
       
  1281        		}
       
  1282        	break;
       
  1283 
       
  1284 		case RTerminalControl3rdPartySession::EPasscodeRequireUpperAndLower:
       
  1285        		{
       
  1286     	    sizeBuf.Num( Server().GetPasscodeRequireUpperAndLowerL() );
       
  1287        		}
       
  1288        	break;
       
  1289        	
       
  1290        	case RTerminalControl3rdPartySession::EPasscodeRequireCharsAndNumbers:
       
  1291        		{
       
  1292     	    sizeBuf.Num( Server().GetPasscodeRequireCharsAndNumbersL() );
       
  1293        		}
       
  1294        	break;
       
  1295        	
       
  1296        	case RTerminalControl3rdPartySession::EPasscodeMaxRepeatedCharacters:
       
  1297        		{
       
  1298     	    sizeBuf.Num( Server().GetPasscodeMaxRepeatedCharactersL() );
       
  1299        		}
       
  1300        	break;
       
  1301        	
       
  1302        	case RTerminalControl3rdPartySession::EPasscodeHistoryBuffer:
       
  1303        		{
       
  1304     	    sizeBuf.Num( Server().GetPasscodeHistoryBufferL() );
       
  1305        		}
       
  1306        	break;
       
  1307        	
       
  1308        	case RTerminalControl3rdPartySession::EPasscodeExpiration:
       
  1309        		{
       
  1310     	    sizeBuf.Num( Server().GetPasscodeExpirationL() );
       
  1311        		}
       
  1312        	break;
       
  1313        	
       
  1314        	case RTerminalControl3rdPartySession::EPasscodeMinChangeTolerance:
       
  1315        		{
       
  1316     	    sizeBuf.Num( Server().GetPasscodeMinChangeToleranceL() );
       
  1317        		}
       
  1318        	break;
       
  1319        	
       
  1320        	case RTerminalControl3rdPartySession::EPasscodeMinChangeInterval:
       
  1321        		{
       
  1322     	    sizeBuf.Num( Server().GetPasscodeMinChangeIntervalL() );
       
  1323        		}
       
  1324        	break;
       
  1325        	
       
  1326        	case RTerminalControl3rdPartySession::EPasscodeCheckSpecificStrings:
       
  1327        		{
       
  1328     	    sizeBuf.Num( Server().GetPasscodeCheckSpecificStringsL() );
       
  1329        		}
       
  1330        	break;
       
  1331        	
       
  1332        	case RTerminalControl3rdPartySession::EPasscodeDisallowSpecific:
       
  1333        		{
       
  1334        		// this is set only value, can not get
       
  1335        		User::Leave( KErrNotSupported );
       
  1336        		}
       
  1337        	break;
       
  1338        	
       
  1339        	case RTerminalControl3rdPartySession::EPasscodeAllowSpecific:
       
  1340        		{
       
  1341        		// this is set only value, can not get
       
  1342        		User::Leave( KErrNotSupported );
       
  1343        		}
       
  1344        	break;
       
  1345        	
       
  1346        	case RTerminalControl3rdPartySession::EPasscodeClearSpecificStrings:
       
  1347        		{
       
  1348     	    // this is set only value, can not get
       
  1349        		User::Leave( KErrNotSupported );
       
  1350        		}
       
  1351        	break;
       
  1352        	
       
  1353        	case RTerminalControl3rdPartySession::EPasscodeMaxAttempts:
       
  1354        		{
       
  1355     	    sizeBuf.Num( Server().GetPasscodeMaxAttemptsL() );
       
  1356        		}
       
  1357        	break;
       
  1358        	
       
  1359        	case RTerminalControl3rdPartySession::EPasscodeConsecutiveNumbers:
       
  1360        		{
       
  1361        		sizeBuf.Num( Server().GetConsecutiveNumbersL() );
       
  1362        		}
       
  1363        	break;
       
  1364        	
       
  1365         case RTerminalControl3rdPartySession::EPasscodeMinSpecialCharacters:
       
  1366             {
       
  1367             sizeBuf.Num( Server().GetPasscodeMinSpecialCharactersL() );
       
  1368             }
       
  1369         break;
       
  1370         
       
  1371         case RTerminalControl3rdPartySession::EPasscodeDisallowSimple:
       
  1372             {
       
  1373             sizeBuf.Num( Server().GetDisallowSimpleL() );
       
  1374             }
       
  1375         break;
       
  1376        	
       
  1377 //#endif
       
  1378 // ----- enhanced features END ----------------
       
  1379         
       
  1380         case RTerminalControl3rdPartySession::EDeviceWipe:
       
  1381         default:
       
  1382         	{
       
  1383         	RDEBUG("CTerminalControlSession::GetDeviceLockParameterL() - 3rd party - ERROR - KErrNotSupported");
       
  1384             User::Leave( KErrNotSupported );
       
  1385         	}
       
  1386         break;
       
  1387         
       
  1388         }    
       
  1389     }
       
  1390     
       
  1391 // ----------------------------------------------------------------------------------------
       
  1392 // CTerminalControlSession::CopyParameterL
       
  1393 // ----------------------------------------------------------------------------------------
       
  1394 HBufC8* CTerminalControlSession::CopyParameterL( const RMessage2 &aMsg, TInt aIndex )
       
  1395     {
       
  1396 	RDEBUG("CTerminalControlSession::CopyParameterL");
       
  1397 
       
  1398     TInt length = aMsg.GetDesLengthL( aIndex );
       
  1399     
       
  1400     HBufC8* buffer = HBufC8::NewL( length );
       
  1401     TPtr8 ptr( buffer->Des() );
       
  1402     aMsg.ReadL( aIndex, ptr );
       
  1403 
       
  1404     return buffer;
       
  1405     }
       
  1406 
       
  1407 // ---------------------------------------------------------
       
  1408 // CTerminalControlSession::IsDeviceMemoryEncrypted
       
  1409 // Checks if phone memory is encrypted or not. 
       
  1410 // ---------------------------------------------------------
       
  1411 TBool CTerminalControlSession::IsDeviceMemoryEncrypted()
       
  1412     {
       
  1413     RDEBUG("CTerminalControlSession::IsDeviceMemoryEncrypted >>");
       
  1414     
       
  1415     TBool ret(EFalse);
       
  1416     
       
  1417     //First check if the feature is supported on device
       
  1418     TRAPD(ferr, FeatureManager::InitializeLibL());
       
  1419     if (ferr != KErrNone)
       
  1420         {
       
  1421         RDEBUG_2("feature mgr initialization error, %d", ferr);
       
  1422         return EFalse;
       
  1423         }
       
  1424     ret = FeatureManager::FeatureSupported( KFeatureIdFfDeviceEncryptionFeature);
       
  1425     FeatureManager::UnInitializeLib();
       
  1426  
       
  1427     //If feature is supported, check if any drive is encrypted.
       
  1428     if (ret)
       
  1429         {
       
  1430         CDevEncSession* devEncSession = new CDevEncSession( EDriveC );
       
  1431         
       
  1432         if (!devEncSession)
       
  1433             {
       
  1434             RDEBUG("Can't instantiate device encryption session..");
       
  1435             return EFalse;
       
  1436             }
       
  1437 
       
  1438         TInt err = devEncSession->Connect();
       
  1439         if (KErrNone == err)
       
  1440             {
       
  1441             //Session with device encryption is established. Check if any drive is encrypted
       
  1442             TInt encStatus (KErrNone);
       
  1443             TInt err = devEncSession->DiskStatus( encStatus );
       
  1444             RDEBUG_3("err = %d, encstatus = %d", err, encStatus);
       
  1445             if (  KErrNone == err && encStatus != EDecrypted )
       
  1446                 {
       
  1447                 RDEBUG("Memory is encrypted");
       
  1448                 ret = ETrue;
       
  1449                 }
       
  1450             else
       
  1451                 {
       
  1452                 RDEBUG("Memory is not encrypted");
       
  1453                 ret = EFalse;
       
  1454                 }
       
  1455             }
       
  1456         else
       
  1457             {
       
  1458             RDEBUG_2("Error %d while establishing connection with device encryption engine", err);
       
  1459             ret = EFalse;
       
  1460             }
       
  1461         
       
  1462         delete devEncSession; devEncSession = NULL;
       
  1463         }
       
  1464     
       
  1465     RDEBUG_2("CTerminalControlSession::IsDeviceMemoryEncrypted, ret = %d <<", ret);
       
  1466     return ret;
       
  1467     }
       
  1468 
       
  1469 // ----------------------------------------------------------------------------------------
       
  1470 // End of file