lowlevellibsandfws/apputils/inc/BALIBA.H
changeset 0 e4d67989cc36
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lowlevellibsandfws/apputils/inc/BALIBA.H	Tue Feb 02 02:01:42 2010 +0200
@@ -0,0 +1,301 @@
+// Copyright (c) 1997-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:
+// Written by Brendan, Dec 1996
+// Library associated files for pluggable components
+// 
+//
+
+#if !defined(__LIBASSOC_H__)
+#define __LIBASSOC_H__
+#if !defined(__F32FILE_H__)
+#include <f32file.h>
+#endif
+
+
+
+
+class TLibAssocBase
+/**
+@publishedAll
+@released
+
+This is an implementation base class for TLibAssoc.
+*/
+	{
+protected:
+	inline TLibAssocBase();
+	IMPORT_C TLibAssocBase(const RLibrary& aLib,TAny* aPtr);
+	IMPORT_C void Set(const RLibrary& aLib,TAny* aPtr);
+	IMPORT_C static void DoUnload(TAny* aThis);
+public:
+	inline TBool IsNull() const;
+private:
+	RLibrary iLibrary;
+protected:
+
+    /**
+    A Pointer to the class instance.
+    */
+	TAny* iPtr;
+	};
+
+
+
+
+//	class TLibAssoc inlines
+inline TLibAssocBase::TLibAssocBase()
+	: iPtr(NULL)
+/**
+Default constructor.
+
+It sets the member TLibAssocBase::iPtr to NULL.
+*/	
+	{}
+
+
+
+
+inline TBool TLibAssocBase::IsNull() const
+/**
+Tests whether the pointer to the class instance is NULL.
+
+@return ETrue, if the pointer is NULL; EFalse, otherwise.
+*/
+	{return iPtr==NULL;}
+
+
+//
+//	class TLibAssoc
+//
+template <class T>
+class TLibAssoc : public TLibAssocBase
+/**
+@publishedAll
+@released
+
+Associates a dynamically loadable DLL and an instance of a class that,
+typically, will have been created using the ordinal 1 function of that DLL.
+
+An object of this type is useful when cleanup behaviour requires that
+a class instance be deleted and the associated DLL be closed.
+
+The DLL is expected to be already open when the TLibAssoc object is created.
+*/
+	{
+public:
+	inline TLibAssoc();
+	inline TLibAssoc(const RLibrary& aLib,T* aClass);
+	inline void Set(const RLibrary& aLib,T* aClass);
+	//
+	inline void Unload();
+	//
+	inline operator TCleanupItem();
+	operator TLibAssoc*(); // undefined, but here to prevent accidental delete(TLibAssoc)
+	//
+	inline T* Ptr();
+	inline const T* PtrC() const;
+	//
+	inline operator T*();
+	inline operator const T*() const;
+	//
+	inline T* operator->();
+	inline const T* operator->() const;
+private:
+	static void Cleanup(TAny* aThis); // for TCleanupOperation
+	};
+
+
+
+
+template <class T>
+inline TLibAssoc<T>::TLibAssoc()
+/**
+Default constructor.
+
+An association between a DLL and a class instance can be made
+after construction using the Set() function.
+*/
+	{}
+
+
+
+template <class T>
+inline TLibAssoc<T>::TLibAssoc(const RLibrary& aLib,T* aClass)
+	: TLibAssocBase(aLib,aClass)
+/**
+Constructs the object taking the specified DLL and an instance of
+the specified class.
+
+@param aLib   A reference to a DLL that has already been opened.
+@param aClass A pointer to an object to be associated with the DLL.
+              Typically, this object will have been created using
+              the ordinal 1 function from that DLL.
+*/	
+	{}
+
+
+
+
+template <class T>
+inline void TLibAssoc<T>::Set(const RLibrary& aLib,T* aClass)
+/**
+Makes an association between the specified DLL and an instance of
+the specified class.
+
+@param aLib   A reference to a DLL that has already been opened.
+@param aClass A pointer to an object to be associated with the DLL.
+              Typically, this object will have been created using
+              the ordinal 1 function from that DLL.
+*/
+	{TLibAssocBase::Set(aLib,aClass);}
+
+
+
+
+template <class T>
+inline T* TLibAssoc<T>::Ptr()
+/**
+Gets a pointer to the class instance.
+
+@return A pointer to the class instance.
+*/
+	{return (T*)iPtr;}
+
+
+
+
+template <class T>
+inline const T* TLibAssoc<T>::PtrC() const
+/**
+Gets a pointer to the const class instance.
+
+@return A pointer to the const class instance.
+*/
+	{return (const T*)iPtr;}
+
+
+
+
+template <class T>
+inline TLibAssoc<T>::operator T*()
+/**
+Conversion operator.
+
+Invoked by the compiler when a TLibAssoc<T> type is passed to a function that
+is prototyped to take a T* type.
+*/
+	{return (T*)iPtr;}
+
+
+
+
+template <class T>
+inline TLibAssoc<T>::operator const T*() const
+/**
+Const conversion operator.
+
+Invoked by the compiler when a TLibAssoc<T> type is passed to a function that
+is prototyped to take a const T* type.
+*/
+	{return (const T*)iPtr;}
+
+
+
+
+template <class T>
+inline T* TLibAssoc<T>::operator->()
+/**
+Dereferencing operator.
+
+@return A pointer to the class instance.
+*/
+	{return (T*)iPtr;}
+
+
+
+
+template <class T>
+inline const T* TLibAssoc<T>::operator->() const
+/**
+Const dereferencing operator.
+
+@return A pointer to the const class instance.
+*/
+	{return (const T*)iPtr;}
+
+
+
+
+template <class T>
+inline TLibAssoc<T>::operator TCleanupItem()
+/**
+The TCleanupItem conversion operator.
+
+Invoked by the compiler when a TLibAssoc<T> type is passed to a function that
+is prototyped to take a TCleanupItem type.
+
+The most common usage is to put a cleanup item onto the cleanup stack using
+CleanupStack::PushL(). The cleanup operation is represented by the private
+static function Cleanup().
+
+For example, if we declare
+
+@code
+TLibAssoc<A> a;
+@endcode 
+
+then we can simply put a cleanup item onto the cleanup stack
+by calling
+
+@code
+CleanupStack::PushL(a);
+@endcode
+
+@see TCleanupItem
+@see CleanupStack::PushL
+*/
+	{return(TCleanupItem(Cleanup,this));}
+
+
+
+
+template <class T>
+inline void TLibAssoc<T>::Unload()
+/**
+Deletes the class instance and calls Close() on the associated DLL.
+
+@see RLibrary::Close
+*/
+	{Cleanup(this);}
+
+
+
+
+template <class T>
+void TLibAssoc<T>::Cleanup(TAny* aThis)
+/**
+The cleanup operation.
+
+The implementation deletes the class instance and calls Close() on
+the associated DLL.
+
+Note that this function is internal and is not intended for use; it is documented
+for completeness.
+*/
+	{
+	delete (T*)(((TLibAssoc<T>*)aThis)->iPtr);
+	TLibAssocBase::DoUnload(aThis);
+	}
+
+#endif