cryptoplugins/cryptospiplugins/test/h4drv/crypto_h4/cryptoldd.h
changeset 8 35751d3474b7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cryptoplugins/cryptospiplugins/test/h4drv/crypto_h4/cryptoldd.h	Thu Sep 10 14:01:51 2009 +0300
@@ -0,0 +1,232 @@
+/*
+* 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: 
+*
+*/
+
+
+/**
+ @file
+ @internalComponent
+ @released
+*/
+#ifndef __CRYPTOLDD__
+#define __CRYPTOLDD__
+#include <e32cmn.h>
+#include <e32ver.h>
+#include <e32def.h>
+#include "cryptojobs.h"
+
+
+class DCryptoLddChannelFactory : public DLogicalDevice
+	{
+public:
+	DCryptoLddChannelFactory();
+	~DCryptoLddChannelFactory();
+	virtual TInt Install();
+	virtual void GetCaps(TDes8& aDes) const;
+	virtual TInt Create(DLogicalChannelBase*& aChannel);
+
+	// The job scheduler for the Random h/w
+	DCryptoJobScheduler iJSRandom;
+
+	// The job scheduler for the AES h/w
+	DCryptoJobScheduler iJSAes;
+	};
+
+class DCryptoPddChannel;
+/**
+  Logical Channel classes for 'Crypto'
+*/
+
+/**
+   DLddChanRandom
+
+   This class just exists to keep all the LDD Chan variables for
+   dealing with Random requests in one place.
+*/
+class DCryptoLddChannel;
+class DLddChanRandom : public DBase, public MCryptoJobCallbacks
+	{
+public:
+	DLddChanRandom(DCryptoLddChannel &aParent);
+	// Cleanup must be done by DCryptoLddChannel destructor because
+	// by the time our destructor gets called the DCryptoLddChannel
+	// has already been destroyed.
+
+	// Functions are virtual so PDD can call them via a vtable instead
+	// of linking directly to them.
+
+    virtual TInt Random(TRequestStatus* aStatus,TDes8* aBuffer);
+
+	// Callbacks for PDD
+	virtual TInt DataRequired();
+	virtual TInt DataAvailable();
+	virtual void JobComplete(TInt aResult);
+	
+	/**
+	   Cancel a user request
+	*/
+	virtual void RandomCancel();
+private:
+	DCryptoLddChannel &iParent;
+    // Members used for processing a Random request
+	
+    TRequestStatus* iRandomStatus;	// User request
+    TDes8* iRandomDescriptor;		// User descriptor
+	TInt iRequestLength;
+	TInt iCurrentIndex;
+
+	CryptoJobRandom *iJob; // Ptr to PDD Random job (not owned by us)
+	};
+
+/**
+   DLddChanAes
+
+   This class just exists to keep all the LDD Chan variables for
+   dealing with Aes requests in one place.
+*/
+class DCryptoLddChannel;
+class DLddChanAes : public DBase, public MCryptoJobCallbacks
+	{
+public:
+	DLddChanAes(DCryptoLddChannel &aParent);
+	// Cleanup must be done by DCryptoLddChannel destructor because
+	// by the time our destructor gets called the DCryptoLddChannel
+	// has already been destroyed.
+
+	// Functions are virtual so PDD can call them via a vtable instead
+	// of linking directly to them.
+
+    virtual TInt SetAesConfig(const TDesC8 *aConfigBuf);
+    virtual TInt AesWrite(TRequestStatus *aStatus, TDesC8 *aBuffer);
+    virtual TInt AesRead(TRequestStatus *aStatus, TDes8 *aBuffer, TUint32 aLength);
+
+	// Callbacks for PDD
+	virtual TInt DataRequired();
+	virtual TInt DataAvailable();
+	virtual void JobComplete(TInt aResult);
+
+	/**
+	   Cancel a user request
+	*/
+	virtual void CancelRead();
+	virtual void CancelWrite();
+private:
+	DCryptoLddChannel &iParent;
+    // Members used for processing a Aes request
+	
+    TRequestStatus *iAesWriteStatus;	// User request
+    TDesC8 *iAesWriteDescriptor;		// User descriptor
+	TInt iWriteRequestLength;
+	TInt iCurrentUserWriteIndex;
+
+    TRequestStatus *iAesReadStatus;	// User request
+    TDes8 *iAesReadDescriptor;		// User descriptor
+	TInt iReadRequestLength;
+	TInt iOriginalUserReadDescLength;
+	TInt iCurrentUserReadIndex;
+
+	TBool iEncrypt;
+	RCryptoDriver::TChainingMode iMode;
+	TInt iKeyLengthBytes;
+
+	CryptoJobAes *iJob; // Ptr to PDD AES job (not owned by us)
+	};
+
+
+class DCryptoLddChannel : public DLogicalChannel
+    {
+public:
+    DCryptoLddChannel();
+    virtual ~DCryptoLddChannel();
+    // Inherited from DObject
+    virtual TInt RequestUserHandle(DThread* aThread, TOwnerType aType);
+    // Inherited from DLogicalChannelBase
+    virtual TInt DoCreate(TInt aUnit, const TDesC8* anInfo, const TVersion& aVer);
+    // Inherited from DLogicalChannel
+    virtual void HandleMsg(TMessageBase* aMsg);
+
+    // Accessor for the LDD Factory
+	inline DCryptoLddChannelFactory *LddFactory() const;
+	
+	DLddChanRandom iLddChanRandom;
+	DLddChanAes iLddChanAes;
+	
+private:
+	friend class DLddChanRandom;
+	friend class DLddChanAes;
+	
+    // Panic reasons
+    enum TPanic
+        {
+        ERequestAlreadyPending = 1
+        };
+    // Implementation for the differnt kinds of requests send through RBusLogicalChannel
+    TInt DoControl(TInt aFunction, TAny* a1, TAny* a2);
+    TInt DoRequest(TInt aReqNo, TRequestStatus* aStatus, TAny* a1, TAny* a2);
+    void DoCancel(TUint aMask);
+
+    // Accessor for the PDD
+	inline DCryptoPddChannel* PddChan() const;
+
+    // Query h/w versions
+    TInt GetHwVersions(TDes8* aHwVersionsBuf) const;
+
+    // Methods for configuration
+    TInt GetConfig(TDes8* aConfigBuf) const;
+    TInt SetConfig(const TDesC8* aConfigBuf);
+	void CurrentConfig(RCryptoDriver::TConfig& aConfig) const;
+
+private:
+    DThread* iClient;
+    };
+inline DCryptoLddChannelFactory *DCryptoLddChannel::LddFactory() const
+	{
+	return static_cast<DCryptoLddChannelFactory *>(iDevice);
+	}
+
+
+class DCryptoPddChannel : public DBase
+    {
+public:
+    virtual TDfcQue* DfcQue() = 0;
+
+    virtual void GetHwVersions(RCryptoDriver::THwVersions& aHwVersions) const = 0;
+    virtual TInt FakeDriverSetting() const = 0;
+    virtual TInt SetFakeDriverSetting(TInt aFakeDriverSetting) = 0;
+
+	virtual CryptoJobRandom *GetJobRandom(TBool aAutoCreate = ETrue) = 0;
+	virtual CryptoJobAes *GetJobAes(TBool aAutoCreate = ETrue) = 0;
+
+	// The LDD chan needs to be able to set this, and the Job
+	// implementation classes need to be able to read it, so there is
+	// no point in having accessor functions for it...
+	DCryptoLddChannel *iCryptoLddChannel;
+    };
+
+
+
+
+
+
+inline DCryptoPddChannel* DCryptoLddChannel::PddChan() const
+    {
+	return static_cast<DCryptoPddChannel *>(iPdd);
+	}
+
+
+
+
+#endif