cryptomgmtlibs/securitycommonutils/inc/scscommon.h
changeset 8 35751d3474b7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cryptomgmtlibs/securitycommonutils/inc/scscommon.h	Thu Sep 10 14:01:51 2009 +0300
@@ -0,0 +1,243 @@
+/*
+* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+* Information shared between SCS client and server implementations,
+* and with the subclass implementations, but not with the client API user.
+*
+*/
+
+
+/**
+ @file
+ @internalTechnology
+ @released
+*/
+
+#ifndef SCSCOMMON_H
+#define SCSCOMMON_H
+
+#include <e32std.h>
+
+#ifndef BULLSEYE_OFF
+#ifdef _BullseyeCoverage
+#define BULLSEYE_OFF "BullseyeCoverage save off";
+#define BULLSEYE_RESTORE "BullseyeCoverage restore";
+#else
+#define BULLSEYE_OFF 
+#define BULLSEYE_RESTORE 
+#endif
+#endif
+
+namespace ScsImpl
+	{
+	/** 
+		Bit position of SCS code in function code.
+
+		Do not change - Some of the codes based off this definition
+		ARE public.
+	*/
+	const TInt KScsFunctionPos = 24;
+	
+	/** 
+		Mask used to extract SCS commands.
+
+		Do not change - Some of the codes based off this definition
+		ARE public.
+	*/
+	const TInt KScsFunctionMask = 0xFF000000;
+	
+	enum TScsFunction
+	/**
+		Bits 31:24 of the function code are reserved for SCS fields.
+		The values below should be or'd into the code that is sent to
+		the server, on the client side.
+		
+		The recognized values intentionally exclude zero, to ensure
+		that a field is added on the client side.
+	 */
+		{
+		/** 
+			Function should be handled by session's DoServiceL.
+
+			This value is effectively PUBLIC because the range used is
+			described by defines in scsserver.h (used for configuring
+			server security).
+		*/
+		ECallSessionFunc = 1 << KScsFunctionPos,
+		
+		/**
+			The SCS sends the lower bits of the function code to the subsession's
+			(not the session's) ServiceL implementation.
+
+			The session's implementation of [Do]ServiceL is not involved.
+
+			This value is effectively PUBLIC because the range used is
+			described by defines in scsserver.h (used for configuring
+			server security).
+		 */
+		ECallSubsessionFunc = 2 << KScsFunctionPos,
+
+		/**
+			This message is send with no function identifier or
+			IPC arguments just before the session is closed.  Although
+			not necessary, it will cancel any outstanding requests on
+			the session or its subsessions with KErrCancel, so if the
+			client has any outstanding requests they will still get
+			completed.
+		 */
+		EPreCloseSession = 3 << KScsFunctionPos,
+		
+		/**
+			Cancel an asynchronous session-relative function.  The low
+			bits of the function code should be the same as the original
+			function code.  E.g. if the function was set up with
+			ENoScsFunction | X then it would be cancelled with ECancelSessionFunction | X.
+
+			The session's implementation of [Do]ServiceL is not involved.
+		 */
+		ECancelSessionFunc = 4 << KScsFunctionPos,
+
+		/**
+			Tells the server that this function will create a new subsession.
+			The low bits can be interpreted by the implementation to indicate
+			a type of subsession.
+		 */
+		ECreateSubsession = 5 << KScsFunctionPos,
+		/**
+			This SCS code should be used on its own.  Any information in the
+			lower bits will be ignored.
+		 */
+		ECloseSubsession = 6 << KScsFunctionPos,
+
+		/**
+			Similar to ECancelSessionFunction, this cancels an asynchronous
+			request on a subsession object.  The request will be completed with
+			KErrCancel.
+
+			The subsession's implementation of ServiceL is not involved.
+
+			@see ECancelSessionFunction
+		 */
+		ECancelSubsessionFunc = 7 << KScsFunctionPos,
+		
+		/**
+			Only supported in debug builds, this function starts a server-side
+			heap mark with __UHEAP_MARK and sets a deterministic failure rate.
+			This function should only be used by RScsClientBase::SetServerHeapFail.
+
+			@see EUHeapResetFail
+			@see RScsClientBase::SetServerHeapFail
+		 */
+		EUHeapSetFail = 8 << KScsFunctionPos,
+
+		/**
+			Only supported in debug builds, this function ends the server-side
+			heap mark set up with EUHeapSetFail, with __UHEAP_MARKEND, and resets
+			the heap failure rate.  This function should only be used by
+			RScsClientBase::ResetServerHeapFail.
+
+			@see EUHeapSetFail
+			@see RScsClientBase::ResetServerHeapFail
+		 */
+		EUHeapResetFail = 9 << KScsFunctionPos,
+
+		/**
+			Intended for debug use, but also present in production builds.
+
+			Returns the PID of the server. This is a number, not a
+			handle, so does not impact security.
+
+		 */
+		EGetServerPid = 10 << KScsFunctionPos,
+
+		/**
+			Intended for debug use, but also present in production builds.
+
+			This call causes a server which has an inactivity shutdown
+			timer to shutdown immediately the next time it is
+			idle. This is just adjusts the timing of existing
+			functionality, so is not believed to impact security.
+
+			If the server has a shutdown timer, then a flag is set
+			which causes the server to immediately exit the next time
+			it becomes idle.
+
+			If the server does not have a shutdown timer, then the
+			calls fails with KErrNotSupported.
+		 */
+		EShutdownAsap = 11 << KScsFunctionPos,
+		
+		/**
+			This value is not used by the server implementation.  It is provided
+			for test code to confirm the server handles an uncrecognized instruction
+			correctly, by failing with KErrNotSupported.
+		 */
+		EScsUnused = 0x20 << KScsFunctionPos
+		};
+	
+	inline void ExtractScsAndImplFunctions(const RMessage2& aMessage, TScsFunction* aScsFunc, TInt* aImplFunc);
+	inline TBool ScsFieldUsed(TInt aFunction);
+
+	/**
+		SCS clients are panicked with this category when invalid
+		input to the server is detected.
+
+		@see TClientPanic
+	 */
+	_LIT(KScsClientPanicCat, "SCS-Client");
+
+	enum TScsClientPanic
+	/**
+		Reasons why the SCS server might panic its clients.
+
+		@see KScsClientPanicCat
+	 */
+		{
+		EScsClBadDesc = 0,				///< Client provided a bad descriptor as an IPC argument.
+		EScsClBadHandle = 1,			///< Client passed a bad subsession handle.
+		EScsClAsyncAlreadyQueued = 2,	///< Client attempted to requeue an outstanding request.
+		
+		/** No-arg session-relative function identifier used reserved SCS bits. */
+		EScsClNoArgsSessUsedScs = 4,
+		
+		/** Arg session-relative function identifier used reserved SCS bits. */
+		EScsClArgsSessUsedScs = 5,
+		
+		/** Arg session-relative async function identifier used reserved SCS bits. */
+		EScsClArgsSessAsyncUsedScs = 6,
+		
+		/** Session-relative cancel function identifier used reserved SCS bits. */
+		EScsClCancelSessUsedScs = 7,
+		
+		/** No-arg subsession-relative function identifier used reserved SCS bits. */
+		EScsClNoArgsSubsessUsedScs = 16,
+		
+		/** Arg subsession-relative function identifier used reserved SCS bits. */
+		EScsClArgsSubsessUsedScs = 17,
+		
+		/** Arg subsession-relative async function identifier used reserved SCS bits. */
+		EScsClArgsSubsessAsyncUsedScs = 18,
+		
+		/* Subsesion-relative cancel function identifier used reserved SCS bits. */
+		EScsClCancelSubsessUsedScs = 19
+		};
+	
+	// defined only in client-side implementation
+	void ClientSidePanic(ScsImpl::TScsClientPanic aReason);
+	}	// namespace ScsImpl
+
+#include <scs/scscommon.inl>
+
+#endif	// #ifndef SCSCOMMON_H
+