--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/examples/convert1/convert1.h Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,336 @@
+// Copyright (c) 2005-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:
+// in its implementation.
+//
+//
+
+/**
+ @file The interface to an example data converter device driver which uses Shared Chunks
+ @publishedPartner
+ @prototype 9.1
+*/
+
+#ifndef __CONVERT1_H__
+#define __CONVERT1_H__
+
+#include <e32cmn.h>
+#include <e32ver.h>
+#ifndef __KERNEL_MODE__
+#include <e32std.h>
+#endif
+
+/**
+User interface for 'Convert1'
+*/
+class RConvert1 : public RBusLogicalChannel
+ {
+public:
+ /**
+ Structure for holding driver capabilities information
+ */
+ class TCaps
+ {
+ public:
+ TVersion iVersion;
+ TInt iMaxChannels; /**< Maximum number of simultaneous channels supported by driver */
+ };
+
+ /**
+ Structure for holding driver configuration data
+ */
+ class TConfig
+ {
+ public:
+ TInt iBufferSize; /**< Size of convert buffer */
+ TBool iCreateInputChunk; /**< True if driver is to create an input chunk */
+ TInt iSpeed; /**< Speed of converter in bytes/second (for this example test) */
+ };
+ typedef TPckgBuf<TConfig> TConfigBuf;
+
+#ifndef __KERNEL_MODE__
+public:
+ RConvert1();
+ TInt Open();
+ void Close();
+ TInt GetConfig(TConfigBuf& aConfig);
+ TInt SetConfig(const TConfigBuf& aConfig);
+ void Convert(const TDesC8& aInput,TRequestStatus& aStatus);
+ void Convert(RChunk aInputChunk,TInt aInputOffset,TInt aInputSize,TRequestStatus& aStatus);
+ void Convert(TInt aSize,TRequestStatus& aStatus);
+ inline RChunk OutChunk() const;
+ inline RChunk InChunk();
+ inline TPtr8 InBuffer();
+private:
+ /**
+ Hide the Duplicate() method by making it private.
+ The purpose of hiding the method is to prevent it's use because this object also contains
+ chunk handles which would need special consideration.
+ We don't want to bother supporting Duplicate() for this particular driver because
+ it only supports a single client thread so normal use wouldn't require Duplicate().
+ */
+ TInt Duplicate(const RThread& aSrc,TOwnerType aType=EOwnerProcess);
+#endif
+
+public:
+ inline static const TDesC& Name();
+ inline static TVersion VersionRequired();
+private:
+ /**
+ Enumeration of Control messages.
+ */
+ enum TControl
+ {
+ EGetConfig,
+ ESetConfig,
+ EConvertDes,
+ EConvertChunk,
+ EConvertInChunk,
+ };
+
+ /**
+ Enumeration of Request messages.
+ (None used in this example)
+ */
+ enum TRequest
+ {
+ ENumRequests,
+ EAllRequests = (1<<ENumRequests)-1
+ };
+
+ /**
+ Structure used to package arguments for a EConvertChunk control message
+ */
+ struct TConvertArgs
+ {
+ TInt iChunkHandle;
+ TInt iOffset;
+ TInt iSize;
+ };
+
+ /**
+ Structure representing input and output buffers
+ */
+ struct TBufferInfo
+ {
+ TInt iOutChunkHandle; /**< Handle to Shared Chunk used to hold output data */
+ TInt iInChunkHandle; /**< Handle to Shared Chunk used to hold input data */
+ TInt iInBufferOffset; /**< Offset within input chunk where the input buffer actually starts */
+ TUint8* iInBufferPtr; /**< Calculated address for start of input buffer within client process */
+ TInt iInBufferSize; /**< Size of input buffer in bytes */
+ };
+
+ TBufferInfo iBufferInfo;
+
+ // Kernel side LDD channel is a friend
+ friend class DConvert1Channel;
+ };
+
+/**
+ The driver's name
+
+ @return The name of the driver
+
+ @internalComponent
+*/
+inline const TDesC& RConvert1::Name()
+ {
+ _LIT(KConvert1Name,"CONVERT1");
+ return KConvert1Name;
+ }
+
+/**
+ The driver's version
+
+ @return The version number of the driver
+
+ @internalComponent
+*/
+inline TVersion RConvert1::VersionRequired()
+ {
+ const TInt KMajorVersionNumber=1;
+ const TInt KMinorVersionNumber=0;
+ const TInt KBuildVersionNumber=KE32BuildVersionNumber;
+ return TVersion(KMajorVersionNumber,KMinorVersionNumber,KBuildVersionNumber);
+ }
+
+/*
+ NOTE: The following methods would normally be exported from a seperate client DLL
+ but are included inline in this header file for convenience.
+*/
+
+#ifndef __KERNEL_MODE__
+
+/**
+ Constructor to clear member data
+*/
+RConvert1::RConvert1()
+ {
+ memclr(&iBufferInfo,sizeof(iBufferInfo));
+ }
+
+/**
+ Open a logical channel to the driver.
+ The opened channel may only be used by the calling trhead.
+
+ @return One of the system wide error codes.
+*/
+TInt RConvert1::Open()
+ {
+ return DoCreate(Name(),VersionRequired(),KNullUnit,NULL,NULL,EOwnerThread);
+ }
+
+/**
+ Close a logical channel to the driver
+*/
+void RConvert1::Close()
+ {
+ OutChunk().Close();
+ InChunk().Close();
+ RBusLogicalChannel::Close();
+ }
+
+/**
+ Get the current configuration settings.
+
+ @param aConfig A structure which will be filled with the configuration settings.
+
+ @return KErrNone
+*/
+TInt RConvert1::GetConfig(TConfigBuf& aConfig)
+ {
+ return DoControl(EGetConfig,(TAny*)&aConfig);
+ }
+
+/**
+ Set the current configuration settings.
+
+ @param aConfig The new configuration settings to be used.
+
+ @return KErrInUse if data convertion is already in progress
+ KErrArgument if any configuration values are invalid.
+ KErrNone otherwise
+
+ @post On success, new memory buffers will have been created and mapped into client process.
+*/
+TInt RConvert1::SetConfig(const TConfigBuf& aConfig)
+ {
+ OutChunk().Close();
+ InChunk().Close();
+ TInt r = DoControl(ESetConfig,(TAny*)&aConfig,&iBufferInfo);
+ if(r!=KErrNone)
+ return r;
+ // Sett address of input
+ if(InChunk().Handle())
+ iBufferInfo.iInBufferPtr = InChunk().Base()+iBufferInfo.iInBufferOffset;
+ return r;
+ }
+
+/**
+ Convert data in the specified descriptor.
+
+ @param aInput A descriptor containing the data to be converted
+ @param aStatus The request status signaled when convertion is complete (or on error).
+ The result value is the offset within OutChunk() where the coverted output
+ data resides; or set to one of the system wide error codes when an error
+ occurs:
+
+ @pre The driver must have been previousely initialised by a call to SetConfig()
+*/
+void RConvert1::Convert(const TDesC8& aInput,TRequestStatus& aStatus)
+ {
+ DoControl(EConvertDes,(TAny*)&aInput,&aStatus);
+ }
+
+/**
+ Convert data in the specified chunk.
+
+ @param aInputChunk The chunk containing the data to be converted
+ @param aInputOffset Offset from start of chunk for the start of data to be converted.
+ @param aInputSize Number of bytes of data to be converted.
+ @param aStatus The request status signaled when convertion is complete (or on error).
+ The result value is the offset within OutChunk() where the coverted output
+ data resides; or set to one of the system wide error codes when an error
+ occurs:
+
+ @pre The driver must have been previousely initialised by a call to SetConfig()
+*/
+void RConvert1::Convert(RChunk aInputChunk,TInt aInputOffset,TInt aInputSize,TRequestStatus& aStatus)
+ {
+ TConvertArgs args;
+ args.iChunkHandle = aInputChunk.Handle();
+ args.iOffset = aInputOffset;
+ args.iSize = aInputSize;
+ DoControl(EConvertChunk,(TAny*)&args,(TAny*)&aStatus);
+ }
+
+/**
+ Convert data in the input chunk. I.e. placed in InBuffer().
+
+ @param aSize Number of bytes of data to be converted.
+ @param aStatus The request status signaled when convertion is complete (or on error).
+ The result value is the offset within OutChunk() where the coverted output
+ data resides; or set to one of the system wide error codes when an error
+ occurs:
+
+ @pre The driver must have been previousely initialised by a call to SetConfig()
+*/
+void RConvert1::Convert(TInt aSize,TRequestStatus& aStatus)
+ {
+ DoControl(EConvertInChunk,(TAny*)aSize,(TAny*)&aStatus);
+ }
+
+/**
+ Obtain the chunk into which converted data will be placed.
+ This chunk may change after calls to SetConfig().
+
+ @return The chunk
+
+ @pre The driver must have been configured using SetConfig()
+ with TConfig::iCreateInputChunk set true.
+*/
+inline RChunk RConvert1::InChunk()
+ {
+ return RChunk((RChunk&)iBufferInfo.iInChunkHandle);
+ }
+
+/**
+ Obtain the chunk into which converted data will be placed.
+ This chunk may change after calls to SetConfig().
+
+ @return The chunk
+
+ @pre The driver must have been configured using SetConfig()
+*/
+inline RChunk RConvert1::OutChunk() const
+ {
+ return RChunk((RChunk&)iBufferInfo.iOutChunkHandle);
+ }
+
+/**
+ Get a pointer descriptor for the input buffer.
+
+ @return A pointer descriptor to the input buffer memory.
+
+ @pre The driver must have been configured using SetConfig()
+ with TConfig::iCreateInputChunk set true.
+*/
+inline TPtr8 RConvert1::InBuffer()
+ {
+ return TPtr8(iBufferInfo.iInBufferPtr,iBufferInfo.iInBufferSize);
+ }
+
+#endif // !__KERNEL_MODE__
+
+#endif
+