--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicsresourceservices/graphicsresourceinterface/inc/sgresource.h Fri Apr 16 16:21:04 2010 +0300
@@ -0,0 +1,503 @@
+// 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 "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:
+// Graphics Resource - general functionality
+//
+
+#ifndef SGRESOURCE_H
+#define SGRESOURCE_H
+
+#include <e32std.h>
+#include <sgresource/sgconst.h>
+
+/**
+Panic codes defined for use by the Graphics Resource API.
+*/
+enum TSgResourcePanicReason
+ {
+ ESgPanicNoDriver = 1,
+ ESgPanicUnclosedResources = 2,
+ ESgPanicBadDrawableHandle = 3,
+ ESgPanicBadAttributeArrayIndex = 4
+ };
+
+/**
+Panics the calling thread with category “SGRES” and the given panic code.
+@param aReason The panic code.
+*/
+inline void Panic(TSgResourcePanicReason aReason);
+
+/**
+A handle to the implementation of the Graphics Resource API
+initialised in the context of a process. It groups miscellaneous functions that
+do not apply to individual drawable resources.
+
+At least one thread in the process must call RSgDriver::Open() before the
+Graphics Resource API can be used in the context of the process.
+When the Graphics Resource API is no longer needed RSgDriver::Close() should be
+called to release unused resources. Note that it is possible to call RSgDriver::Open()
+and RSgDriver::Close() from different threads.
+*/
+NONSHARABLE_CLASS(RSgDriver)
+ {
+public:
+ /**
+ Default constructor.
+ @post The instance of RSgDriver is a null handle.
+ */
+ inline RSgDriver();
+
+ /**
+ Initialises the implementation of the Graphics Resource API in the context
+ of a process if it is not initialised already, updates the implementation
+ opening count in the process and returns KErrNone if successful.
+ Each successful call to RSgDriver::Open() in a process should be balanced
+ by a corresponding call to RSgDriver::Close() in the same process, but not
+ necessarily from the same thread.
+
+ Note that an RSgDriver handle should never be bitwise-copied into another
+ but this function should be used instead in all cases, since it is the only
+ way to ensure that the implementation opening count is kept up to date.
+ Failure to keep the implementation opening count up to date may result in
+ the implementation of the Graphics Resource API becoming unexpectedly
+ unavailable and, as a consequence, in an abnormal termination of the process.
+
+ @pre The instance of RSgDriver is a null handle.
+ @post The instance of RSgDriver references the implementation of the Graphics
+ Resource API initialised in the context of the process.
+ @return KErrNone if successful;
+ KErrInUse if the instance of RSgDriver is not a null handle;
+ KErrNoMemory if there is not enough system memory to initialise the
+ implementation of the Graphics Resource API;
+ KErrNoGraphicsMemory if there is not enough specialised graphics memory
+ to initialise the implementation of the Graphics Resource API.
+ */
+ IMPORT_C TInt Open();
+
+ /**
+ Decrements the implementation opening count in the process.
+ When the count reaches zero, checks whether there are still open handles to
+ drawable resources in the process and carries out termination tasks to
+ release the internal resources used by the implementation of the Graphics
+ Resource API.
+
+ An attempt to carry out these termination tasks will panic with category
+ “SGRES” and code 2 in debug builds if there still are any open handles to
+ drawable resources in the process. In release builds all the open handles
+ to drawable resources in the process are silently closed at this point.
+ Calling this function on a null handle has no effect.
+
+ @post The instance of RSgDriver is a null handle.
+ @panic SGRES 2 Debug builds only. There are open handles to drawable resources
+ in the process during termination.
+ */
+ IMPORT_C void Close();
+
+ /**
+ Makes the extension interface specified by the type of the parameter
+ aInterfacePtr available in the context of the process.
+ This function stores a pointer to the extension interface in the variable
+ referenced by the parameter aInterfacePtr and returns KErrNone if successful.
+
+ @pre An RSgDriver has been opened in the context of the process.
+ @param[out] aInterfacePtr Reference to a pointer to the interface class that on return points
+ to the extension interface or, in case of error, is set to NULL.
+ @return KErrNone if successful;
+ KErrBadHandle if the instance of RSgDriver is a null handle;
+ KErrExtensionNotSupported if the requested extension interface is not supported.
+ */
+ template<class M> inline TInt GetInterface(M*& aInterfacePtr) const;
+
+ /**
+ Returns the version of the implementation of the Graphics Resource API.
+ The version comprises 3 numbers: major version number, minor version number
+ and build number.
+
+ Major revisions mean incompatible changes in the API.
+ Minor revisions mean forward-compatible changes in the API.
+ Build numbers are unrelated to API changes.
+
+ @return The version of the implementation of the Graphics Resource API.
+ */
+ IMPORT_C static TVersion Version();
+private:
+ /**
+ Copy constructor.
+ Implementation not provided. Declared private to prevent bit-wise copying
+ of handles.
+ */
+ RSgDriver(const RSgDriver&);
+
+ /**
+ Assignment operator.
+ Implementation not provided. Declared private to prevent bit-wise copying
+ of handles.
+ */
+ const RSgDriver& operator =(const RSgDriver&);
+
+ /**
+ Makes the extension interface with the given UID available in the context
+ of the process.
+ This function stores a pointer to the extension interface in the variable
+ referenced by the parameter aInterfacePtr and returns KErrNone if successful.
+
+ @pre An RSgDriver has been opened in the context of the process.
+ @param[in] aInterfaceUid The UID of the extension interface.
+ @param[out] aInterfacePtr Reference to an untyped pointer that on return points
+ to the extension interface or, in case of error, is set to NULL.
+ @return KErrNone if successful;
+ KErrBadHandle if the instance of RSgDriver is a null handle;
+ KErrArgument if aInterfaceUid is the null UID;
+ KErrExtensionNotSupported if the requested extension interface is not supported.
+ */
+ IMPORT_C TInt GetInterface(TUid aInterfaceUid, TAny*& aInterfacePtr) const;
+private:
+ /** A pointer to an implementation-defined object initially set to NULL by the constructor.*/
+ TAny* iImpl;
+ };
+
+/**
+An extension attribute.
+*/
+NONSHARABLE_CLASS(TSgAttribute)
+ {
+public:
+ /**
+ Default constructor.
+ Data members remain uninitialised.
+ */
+ inline TSgAttribute();
+
+ /**
+ Constructor which initialises data members to the given values.
+ */
+ inline TSgAttribute(TUid aUid, TInt aValue);
+public:
+ /** A UID that identifies the type of extension attribute.*/
+ TUid iUid;
+ /** The value of the extension attribute.*/
+ TInt iValue;
+ };
+
+/**
+Base class of all attribute array classes.
+It defines functions for bounds-checked access to extension attributes.
+*/
+NONSHARABLE_CLASS(TSgAttributeArrayBase)
+ {
+public:
+ /**
+ Returns the number of extension attributes in the array.
+ @return The number of extension attributes in the array.
+ */
+ inline TInt Count() const;
+
+ /**
+ Returns a reference to the extension attribute located in the array at the
+ given position.
+
+ @pre aIndex is equal to or greater than zero and less than the number of
+ extension attributes in the array.
+ @param aIndex The position of the extension attribute in the array.
+ @return A reference to the extension attribute located in the array at the
+ given position.
+ @panic SGRES 4 Debug builds only. aIndex is out of bounds.
+ */
+ inline TSgAttribute& operator [](TInt aIndex);
+
+ /**
+ Returns a const-qualified reference to the extension attribute located in
+ the array at the given position.
+
+ @pre aIndex is equal to or greater than zero and less than the number of
+ extension attributes in the array.
+ @param aIndex The position of the extension attribute in the array.
+ @return A reference to the extension attribute located in the array at the
+ given position.
+ @panic SGRES 4 Debug builds only. aIndex is out of bounds.
+ */
+ inline const TSgAttribute& operator [](TInt aIndex) const;
+protected:
+ /**
+ Constructor used by constructors of derived classes to initialise the
+ attribute count.
+ @param aCount The number of extension attributes.
+ */
+ inline TSgAttributeArrayBase(TInt aCount);
+
+ /**
+ Assignment operator.
+ No operation is performed. Allows the compiler to generate assignment
+ operators for derived classes automatically.
+ */
+ inline void operator =(const TSgAttributeArrayBase&);
+private:
+ const TInt iCount;
+ };
+
+/**
+A fixed-size array of extension attributes.
+It is a thin wrapper with bounds checking for arrays of TSgAttribute.
+*/
+template<TInt S>
+NONSHARABLE_CLASS(TSgAttributeArray): public TSgAttributeArrayBase
+ {
+public:
+ /**
+ Default constructor.
+ Data members remain uninitialised.
+ */
+ inline TSgAttributeArray();
+private:
+ TSgAttribute iAttributes[S];
+ };
+
+/**
+A system-wide unique 64-bit identifier that can be used to share a drawable
+resource between processes.
+
+The actual value of a drawable resource identifier has no meaning to the user
+of the Graphics Resource API, except that 64 zero bits represent the null
+drawable resource identifier, which explicitly identifies no drawable resource.
+As a convenience, the constant KSgNullDrawableId is defined as the null drawable
+resource identifier.
+*/
+NONSHARABLE_CLASS(TSgDrawableId)
+ {
+public:
+ /**
+ Equality operator.
+ Tests whether the given drawable resource identifier is the same as this.
+
+ @param aId The drawable resource identifier to compare with this.
+ @return ETrue if the 64-bit identifiers are the same, EFalse if not.
+ */
+ inline TBool operator ==(TSgDrawableId aId) const;
+
+ /**
+ Inequality operator.
+ Tests whether the given drawable resource identifier is different from this.
+
+ @param aId The drawable resource identifier to compare with this.
+ @return ETrue if the 64-bit identifiers are different, EFalse if they are the same.
+ */
+ inline TBool operator !=(TSgDrawableId aId) const;
+public:
+ /** The 64-bit identifier.*/
+ TUint64 iId;
+ };
+
+/**
+The null drawable resource identifier.
+*/
+const TSgDrawableId KSgNullDrawableId = {0};
+
+/**
+The UID identifying a RSgDrawable handle.
+This must never be changed.
+*/
+const TUid KSgDrawableTypeUid = {0x102858EB};
+
+/**
+A drawable resource handle.
+A null handle is a handle that explicitly does not reference any drawable resource.
+An open handle is a handle that references an existing drawable resource.
+An invalid handle is a handle that is not null but does not reference any
+existing drawable resource.
+Drawable resources are reference-counted so that a drawable resource is not
+destroyed while there still are open handles to it in any process in the system.
+
+RSgDrawable is not an abstract class, that is, it can be instantiated,
+but it can also be derived from to define subclasses representing types of
+handles that refer only to concrete types of drawable resources, for example,
+image handles. RSgImage is the only subclass of RSgDrawable defined in version
+1.1 of the Graphics Resource API.
+Instances of RSgDrawable are useful when drawable resources created in a
+component have to be passed to another component through a third component that
+cannot depend on the concrete type of the drawable resources being passed.
+@see RSgImage
+*/
+NONSHARABLE_CLASS(RSgDrawable)
+ {
+public:
+ /**
+ Default constructor.
+ @post The instance of RSgDrawable is a null handle.
+ */
+ inline RSgDrawable();
+
+ /**
+ Opens a new handle to the drawable resource with the given drawable resource
+ identifier.
+ The drawable resource may have been created in the same process or in a
+ different one. This function does not allocate any specialised graphics memory.
+
+ Note that an RSgDrawable handle should never be bitwise-copied into another
+ but this function should be used instead in all cases, since it is the only
+ way to ensure that the reference count of the drawable resource is kept up
+ to date. Failure to keep the reference count of the resource up to date may
+ result in invalid handles.
+
+ @pre An RSgDriver handle has been opened in the context of the process.
+ @pre The instance of RSgDrawable is a null handle.
+ @post The specified drawable resource has its reference count incremented by one.
+ @param aId The identifier of the drawable resource.
+ @param aAttributes A pointer to an array of extension attributes,
+ if allowed by any extension of the Graphics Resource API, or NULL otherwise.
+ @return KErrNone if successful;
+ KErrInUse if the instance of RSgDrawable is an open handle;
+ KErrArgument if the parameter aId is the null drawable resource identifier;
+ KErrNotSupported if the parameter aAttributes is not NULL and one or more
+ of the extension attributes in the array is not defined by any extension
+ of the Graphics Resource API;
+ KErrNotFound if the parameter aId cannot be found to refer to an existing
+ drawable resource;
+ KErrNoMemory if it fails due to lack of system memory.
+ @panic SGRES 1 No RSgDriver handle has been opened in the context of the process.
+ */
+ IMPORT_C TInt Open(TSgDrawableId aId, const TSgAttributeArrayBase* aAttributes = NULL);
+
+ /**
+ Closes a handle to a drawable resource.
+ It decrements the reference count of the drawable resource and, if it reaches
+ zero, destroys the drawable resource.
+ Calling this function on a null handle has no effect.
+
+ @pre If the instance of RSgDrawable is not a null handle then an RSgDriver
+ handle has been opened in the context of the process.
+ @post The instance of RSgDrawable is a null handle.
+ @panic SGRES 1 The instance of RSgDrawable is not a null handle and no
+ RSgDriver handle has been opened in the context of the process.
+ @panic SGRES 3 The instance of RSgDrawable is an invalid handle.
+ */
+ IMPORT_C void Close();
+
+ /**
+ Returns the identifier of the drawable resource.
+ This identifier can be used to open another handle to the drawable resource
+ in the same process or in a different process.
+ Calling this function on a null handle returns the null drawable resource
+ identifier.
+
+ @pre If the instance of RSgDrawable is not a null handle then an RSgDriver
+ handle has been opened in the context of the process.
+ @return The identifier of the drawable resource.
+ @panic SGRES 1 The instance of RSgDrawable is not a null handle and no
+ RSgDriver handle has been opened in the context of the process.
+ @panic SGRES 3 The instance of RSgDrawable is an invalid handle.
+ */
+ IMPORT_C TSgDrawableId Id() const;
+
+ /**
+ Tests whether a handle is null.
+ @return ETrue if the instance of RSgDrawable is a null handle; EFalse otherwise.
+ */
+ inline TBool IsNull() const;
+
+ /**
+ Returns the UID corresponding to the concrete type of the drawable resource
+ referenced by a handle at run-time.
+ Calling this function on a null handle returns the null UID.
+ In version 1.1 of the Graphics Resource API every drawable resource is an image,
+ so this function always returns KSgImageTypeUid when called on an open handle.
+
+ @pre If the instance of RSgDrawable is not a null handle then an RSgDriver
+ handle has been opened in the context of the process.
+ @return The UID corresponding to the concrete type of the drawable resource.
+ @panic SGRES 1 The instance of RSgDrawable is not a null handle and no
+ RSgDriver handle has been opened in the context of the process.
+ @panic SGRES 3 The instance of RSgDrawable is an invalid handle.
+ */
+ IMPORT_C TUid DrawableType() const;
+
+ /**
+ Makes the extension interface specified by the type of the parameter
+ aInterfacePtr available on a drawable resource.
+ This function stores a pointer to the extension interface in the variable
+ referenced by the parameter aInterfacePtr and returns KErrNone if successful.
+ The returned extension interface is tied to the drawable resource, that is,
+ calls to functions in the returned extension interface operate on the
+ drawable resource.
+
+ @pre An RSgDriver handle has been opened in the context of the process.
+ @pre The instance of RSgDrawable is an open handle.
+ @param[out] aInterfacePtr Reference to a pointer to the interface class. that on return points
+ to the extension interface or, in case of error, is set to NULL.
+ @return KErrNone if successful;
+ KErrBadHandle if the instance of RSgDrawable is a null handle;
+ KErrExtensionNotSupported if the requested extension interface is not supported.
+ @panic SGRES 1 No RSgDriver handle has been opened in the context of the process.
+ @panic SGRES 3 The instance of RSgDrawable is an invalid handle.
+ */
+ template<class M> inline TInt GetInterface(M*& aInterfacePtr) const;
+protected:
+ /**
+ Handle base constructor.
+ Used by constructors of derived classes to initialise the handle type.
+ @post The instance of RSgDrawable is a null handle.
+ @param aHandleType The UID identifying the handle type.
+ */
+ inline RSgDrawable(TUid aHandleType);
+private:
+ /**
+ Copy constructor.
+ Implementation not provided. Declared private to prevent bit-wise copying
+ of handles.
+ */
+ RSgDrawable(const RSgDrawable&);
+
+ /**
+ Assignment operator.
+ Implementation not provided. Declared private to prevent bit-wise copying
+ of handles.
+ */
+ const RSgDrawable& operator =(const RSgDrawable&);
+
+ /**
+ Makes the extension interface with the given UID available on a drawable
+ resource.
+ This function stores a pointer to the extension interface in the variable
+ referenced by the parameter aInterfacePtr and returns KErrNone if successful.
+ The returned extension interface is tied to the drawable resource, that is,
+ calls to functions in the returned extension interface operate on the
+ drawable resource.
+
+ @pre An RSgDriver handle has been opened in the context of the process.
+ @pre The instance of RSgDrawable is an open handle.
+ @param[in] aInterfaceUid The UID of the extension interface.
+ @param[out] aInterfacePtr Reference to an untyped pointer that on return points
+ to the extension interface or, in case of error, is set to NULL.
+ @return KErrNone if successful;
+ KErrBadHandle if the instance of RSgDrawable is a null handle;
+ KErrArgument if aInterfaceUid is the null UID;
+ KErrExtensionNotSupported if the requested extension interface is not supported.
+ @panic SGRES 1 No RSgDriver handle has been opened in the context of the process.
+ @panic SGRES 3 The instance of RSgDrawable is an invalid handle.
+ */
+ IMPORT_C TInt GetInterface(TUid aInterfaceUid, TAny*& aInterfacePtr) const;
+protected:
+ /**
+ A UID permanently set by the constructor to the constant
+ KSgDrawableTypeUid, except for subclasses of RSgDrawable, in which case it
+ is permanently set by the constructor to the UID corresponding to the
+ concrete type of drawable resource referenced by instances of the subclass.
+ */
+ const TUid iHandleType;
+
+ /** A pointer to an implementation-defined object initially set to NULL by the constructor.*/
+ TAny* iImpl;
+ };
+
+#include <sgresource/sgresource.inl>
+
+#endif // SGRESOURCE_H