os/ossrv/lowlevellibsandfws/pluginfw/Framework/frame/clientrequest.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 // Copyright (c) 2003-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 //
    15 
    16 //system includes
    17 #include <e32std.h>
    18 #include <u32std.h>
    19 
    20 //class signature
    21 #include "clientrequest.h"
    22 
    23 #ifndef __ECOMSERVER_TESTING__
    24 
    25 //
    26 // TClientRequest
    27 //
    28 TClientRequest::TClientRequest(const RMessage2& aMessage)
    29 : iMessage(aMessage), iSecurityInfo(aMessage)
    30 	{
    31 	}
    32 	
    33 TBool TClientRequest::IsNull() const
    34 	{
    35 	return iMessage.IsNull();
    36 	}
    37 
    38 TInt TClientRequest::Function() const
    39 	{
    40 	return iMessage.Function();
    41 	}
    42 
    43 void TClientRequest::Complete(TInt aReason) const
    44 	{
    45 	iMessage.Complete(aReason);
    46 	}
    47 
    48 void TClientRequest::Panic(const TDesC& aCategory, TInt aReason) const
    49 	{
    50 	iMessage.Panic(aCategory, aReason);
    51 	}
    52 
    53 TInt TClientRequest::Int0() const
    54 	{
    55 	return iMessage.Int0();
    56 	}
    57 
    58 TInt TClientRequest::Int1() const
    59 	{
    60 	return iMessage.Int1();
    61 	}
    62 
    63 TInt TClientRequest::Int2() const
    64 	{
    65 	return iMessage.Int2();
    66 	}
    67 
    68 TInt TClientRequest::Int3() const
    69 	{
    70 	return iMessage.Int3();
    71 	}
    72 
    73 TInt TClientRequest::GetDesLength(TInt aParam) const
    74 	{
    75 	return iMessage.GetDesLength(aParam);
    76 	}
    77 
    78 TInt TClientRequest::GetDesMaxLength(TInt aParam) const
    79 	{
    80 	return iMessage.GetDesMaxLength(aParam);
    81 	}
    82 
    83 void TClientRequest::ReadL(TInt aParam, TDes8& aDes, TInt aOffset) const
    84 	{
    85 	iMessage.ReadL(aParam, aDes, aOffset);
    86 	}
    87 
    88 void TClientRequest::ReadL(TInt aParam, TDes& aDes, TInt aOffset) const
    89 	{
    90 	iMessage.ReadL(aParam, aDes, aOffset);
    91 	}
    92 
    93 TInt TClientRequest::Write(TInt aParam, const TDesC8& aDes, TInt aOffset) const
    94 	{
    95 	return iMessage.Write(aParam, aDes, aOffset);
    96 	}
    97 
    98 void TClientRequest::WriteL(TInt aParam, const TDesC8& aDes) const
    99 	{
   100 	iMessage.WriteL(aParam, aDes); 
   101 	}
   102 
   103 void TClientRequest::WriteL(TInt aParam, const TDesC& aDes, TInt aOffset) const
   104 	{
   105 	iMessage.WriteL(aParam, aDes, aOffset);
   106 	}
   107 	
   108 //
   109 // TCapabilitySet is the low level API used by all other capability APIs.
   110 // It relies on the caller to observe the PlatSecEnforcement settings.
   111 //
   112 TBool TClientRequest::HasCapabilities(const TCapabilitySet& aCapabilities) const
   113 	{
   114 	return aCapabilities.HasCapabilities(iSecurityInfo.iCaps);
   115 	}
   116 
   117 #ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
   118 //
   119 // This method relies on PlatSec::CapabilityCheckFail
   120 // to observe the PlatSecDiagnostics flag.
   121 //
   122 void TClientRequest::EmitDiagnostic(const TCapabilitySet& aCapabilities, const CImplementationInformation& aImplInfo) const
   123 	{
   124 	TCapabilitySet capsMissing(iSecurityInfo.iCaps);
   125 	capsMissing.Remove(aCapabilities);
   126 	_LIT8(KErrorFormat, "ECOM: Client (%x) may not access plugin implementation (%x_v%d)");
   127 	TBuf8<128> errorMsg;
   128 	errorMsg.Format(KErrorFormat, iSecurityInfo.iSecureId.iId, aImplInfo.ImplementationUid(), aImplInfo.Version());
   129 	errorMsg.ZeroTerminate();
   130 	PlatSec::CapabilityCheckFail(
   131 		iMessage,
   132 		capsMissing,
   133 		__PLATSEC_DIAGNOSTIC_STRING(reinterpret_cast<const char*>(errorMsg.Ptr())));
   134 	}
   135 #endif
   136 
   137 //
   138 // This method serves three purposes:
   139 // 1. Perform capability check.
   140 // 2. Emit diagnostic message (if capability check failed and __REMOVE_PLATSEC_DIAGNOSTICS__ is *not* defined.)
   141 // 3. Observe the PlatSecEnforcement flag and return if capability check has failed.
   142 //
   143 // If enforcement is not enabled then the caller should proceed as though the original capability check in fact passed.
   144 // If enforcement is enabled then the appropriate action for a failed capability check should happen.
   145 //
   146 // Two possible return values:
   147 // 1. ETrue  - if capability check passed OR PlatSecEnforcement is Off.
   148 // 2. EFalse - if capability check failed AND PlatSecEnforcement is On.
   149 //
   150 TBool TClientRequest::CheckCapability(const TCapabilitySet& aCapabilities, const CImplementationInformation&
   151 #ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
   152 	aImplInfo
   153 #endif
   154 	) const
   155 	{
   156 	TBool hasCapabilities = HasCapabilities(aCapabilities);
   157 #ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
   158 	if (!hasCapabilities) 
   159 		EmitDiagnostic(aCapabilities, aImplInfo);
   160 #endif
   161 	return !hasCapabilities && PlatSec::ConfigSetting(PlatSec::EPlatSecEnforcement) ? EFalse : ETrue;
   162 	}
   163 //
   164 //
   165 #else //IF _UNIT_TESTING_
   166 
   167 TClientRequest::TClientRequest()
   168 : iFunction(KMinTInt), iCapability(0U), iCompletion(KRequestPending),
   169 iStatusActive(EFalse), iIdentity(KNullUid)
   170 	{
   171 	Mem::FillZ(&iParams, sizeof(TInt) * KMaxMessageArguments);
   172 	}
   173 
   174 TBool TClientRequest::IsNull() const
   175 	{
   176 	return iFunction == KMinTInt;
   177 	}
   178 
   179 TInt TClientRequest::Function() const
   180 	{
   181 	return iFunction;
   182 	}
   183 
   184 TUid TClientRequest::Identity() const
   185 	{
   186 	return iIdentity;
   187 	}
   188 
   189 void TClientRequest::Complete(TInt aReason) const
   190 	{
   191 	iCompletion = aReason;
   192 	if(iStatusActive)
   193 		{
   194 		TRequestStatus* stat = iStatus;
   195 		User::RequestComplete(stat, aReason);
   196 		}
   197 	}
   198 
   199 void TClientRequest::Panic(const TDesC& aCategory, TInt aReason) const
   200 	{
   201 	User::Panic(aCategory, aReason);
   202 	}
   203 
   204 TInt TClientRequest::Int0() const
   205 	{
   206 	return iParams[0];
   207 	}
   208 
   209 TInt TClientRequest::Int1() const
   210 	{
   211 	return iParams[1];
   212 	}
   213 
   214 TInt TClientRequest::Int2() const
   215 	{
   216 	return iParams[2];
   217 	}
   218 
   219 TInt TClientRequest::Int3() const
   220 	{
   221 	return iParams[3];
   222 	}
   223 
   224 TInt TClientRequest::GetDesLength(TInt aParam) const
   225 	{
   226 	const TDesC8* desPtr = (const TDesC8*)iParams[aParam];
   227 	return desPtr->Length();
   228 	}
   229 
   230 TInt TClientRequest::GetDesMaxLength(TInt aParam) const
   231 	{
   232 	const TDes8* desPtr = (const TDes8*)iParams[aParam];
   233 	return desPtr->MaxLength();
   234 	}
   235 
   236 void TClientRequest::ReadL(TInt aParam, TDes8& aDes, TInt aOffset) const
   237 	{
   238 	const TDesC8* desPtr = (const TDesC8*)iParams[aParam];
   239 	aDes.Copy(desPtr->Mid(aOffset));
   240 	}
   241 
   242 void TClientRequest::ReadL(TInt aParam, TDes& aDes, TInt aOffset) const
   243 	{
   244 	const TDesC* desPtr = (const TDesC*)iParams[aParam];
   245 	aDes.Copy(desPtr->Mid(aOffset));
   246 	}
   247 
   248 TInt TClientRequest::Write(TInt aParam, const TDesC8& aDes, TInt aOffset) const
   249 	{
   250 	TDes8* desPtr = (TDes8*)iParams[aParam];
   251 	desPtr->Copy(aDes.Mid(aOffset));
   252 	return KErrNone;
   253 	}
   254 
   255 void TClientRequest::WriteL(TInt aParam, const TDesC8& aDes) const
   256 	{
   257 	User::LeaveIfError(Write(aParam, aDes));
   258 	}
   259 
   260 void TClientRequest::WriteL(TInt aParam, const TDesC& aDes, TInt aOffset) const
   261 	{
   262 	TDes* desPtr = (TDes*)iParams[aParam];
   263 	desPtr->Copy(aDes.Mid(aOffset));
   264 	}
   265 
   266 TBool TClientRequest::HasCapabilities(const TCapabilitySet& aCapabilities) const
   267 //dummy function here for testing purpose
   268 	{
   269 	TCapabilitySet dummycaps;
   270 	dummycaps.SetEmpty();
   271 	return aCapabilities.HasCapabilities(dummycaps);
   272 	}
   273 
   274 #ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
   275 void TClientRequest::EmitDiagnostic(const TCapabilitySet& /*aCapabilities*/, const CImplementationInformation& /*aImplInfo*/) const
   276 // do nothing
   277 	{
   278 	}
   279 #endif
   280 
   281 TBool TClientRequest::CheckCapability(const TCapabilitySet& aCapabilities, const CImplementationInformation& /*aImplInfo*/) const
   282 	{
   283 	return HasCapabilities(aCapabilities);
   284 	}
   285 #endif //__ECOMSERVER_TESTING__