sensorservices/sensorserver/inc/server/sensrvtransactionqueue.h
changeset 0 4e1aa6a622a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sensorservices/sensorserver/inc/server/sensrvtransactionqueue.h	Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,233 @@
+/*
+* Copyright (c) 2006 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:  Transaction queue implementation
+*
+*/
+
+
+#ifndef SENSRVTRANSACTIONQUEUE_H
+#define SENSRVTRANSACTIONQUEUE_H
+
+#include <e32base.h>
+
+class CSensrvTransaction;
+class CSensrvSession;
+
+/**
+ * Simple to use transaction queue.
+ *
+ * @since S60 5.0
+ */
+class CSensrvTransactionQueue : public CBase
+    {
+    public:
+        
+        /**
+        * Removal type specifies what should be done to removed transaction.
+        */
+        enum TRemovalType
+            {
+            ERemovalTypeUndefined, ///< Only valid removal type for non-owning queues
+            ERemovalTypeComplete,  ///< Completes and deletes transaction
+            ERemovalTypeCancel,    ///< Completes with KErrCancel and deletes transaction
+            ERemovalTypeTransfer   ///< Transaction is just removed, not deleted or completed
+            };
+        
+        /**
+        * Linkable transaction pointer.
+        */
+        class TLinkableTransactionPtr
+            {
+            public:
+                TLinkableTransactionPtr()
+                    {
+                    }
+
+                /**
+                * Link item for queueing transaction pointers
+                */
+                TSglQueLink iLink;
+                
+                /**
+                * Transaction pointer
+                * Not owned.
+                */
+                CSensrvTransaction* iTransaction;
+            };
+
+
+        /**
+        * Two phase constructor.
+        *
+        * @since S60 5.0
+        * @param aOwned Indicates if queue owns transactions or is
+        *        it used simply to store the pointers.
+        *        If transactions are owned, deleting queue will
+        *        also delete all transactions.
+        * @return New CSensrvTransactionQueue instance
+        * @exception KErrNoMemory Out of memory.
+        */
+        static CSensrvTransactionQueue* NewL(TBool aOwned);
+
+        /**
+        * Destructor.
+        */
+        virtual ~CSensrvTransactionQueue();
+
+        /**
+        * Adds transaction to the the queue
+        *
+        * @since S60 5.0
+        * @param aTransaction The transaction to be added.
+        * @param aLast If ETrue, transaction is added to the end of
+        *        the queue, otherwise it is added to the beginning.
+        * @return KErrNoMemory: Out of memory.
+        *         KErrArgument: NULL transaction.
+        */
+        TInt Add(CSensrvTransaction* aTransaction, TBool aLast = ETrue);
+
+        /**
+        * Removes specified transaction from queue, if it is there.
+        * If queue owns the transactions, the removed transaction
+        * may be completed and deleted, depending on removal type. 
+        *
+        * @since S60 5.0
+        * @param aTransaction The transaction to be removed.
+        * @param aRemovalType Determines removal type.
+        * @see TRemovalType
+        */
+        void Remove(CSensrvTransaction* aTransaction,
+                    TRemovalType aRemovalType = ERemovalTypeUndefined);
+
+        /**
+        * Removes all transactions initiated by specified session
+        * from queue.
+        * If queue owns the transactions, the transactions
+        * are completed with KErrCancel and are deleted. Otherwise 
+        * does not delete or complete transactions.
+        *
+        * @since S60 5.0
+        * @param aSession The session to match.
+        */
+        void Remove(CSensrvSession* aSession);
+
+        /**
+        * Removes all transactions with timestamp older than
+        * specified cutoff time. 
+        *
+        * @since S60 5.0
+        * @param aCutoffTime Transactions older that this time
+        *        will be removed.
+        * @return Number of transactions removed.
+        */
+        TInt RemoveObsolete(const TTime& aCutoffTime);
+
+        /**
+        * Removes all transactions.
+        *
+        * @since S60 5.0
+        */
+        void RemoveAll();
+
+        /**
+        * Gets pointer to first transaction in queue.
+        * Transaction stays in the queue.
+        *
+        * @since S60 5.0
+        * @return Pointer to first transaction in queue or NULL if empty.
+        */
+        CSensrvTransaction* First();
+        
+        /**
+        * Checks if queue is empty
+        *
+        * @since S60 5.0
+        * @return ETrue if queue is empty.
+        */
+        inline TBool IsEmpty() {return iTransactionPtrList.IsEmpty(); };
+        
+
+    private:
+
+        /**
+        * C++ constructor
+        *
+        * @since S60 5.0
+        * @param aOwner Indicates if queue owns transactions or is
+        *        it used simply to store the pointers.
+        *        Deleting queue will delete all transactions if transactions
+        *        are owned.
+        */
+        CSensrvTransactionQueue(TBool aOwned);
+
+        /**
+        * 2nd phase of construction
+        *
+        * @since S60 5.0
+        */
+        void ConstructL();
+
+        /**
+        * Gets pointer to the TLinkableTransactionPtr in queue
+        * corresponding to specified transaction.
+        * Transaction stays in the queue.
+        *
+        * @since S60 5.0
+        * @param aTransaction The transaction to be found.
+        * @return Pointer to TLinkableTransactionPtr or NULL if not found.
+        */
+        TLinkableTransactionPtr* FindTransactionPtr(CSensrvTransaction* aTransaction);  
+        
+        /**
+        * Removes linkable transaction pointer and deletes it. 
+        * If transactions are owned, they are completed with KErrCancel
+        * or whatever error code they currently have.
+        *
+        * @since S60 5.0
+        * @param aPtr Linkable transaction pointer to remove 
+        * @param aRemovalType Determines removal type.
+        * @see TRemovalType
+        */
+        void RemovePtr(TLinkableTransactionPtr* aPtr, TRemovalType aRemovalType);
+             
+
+    private:
+    
+        /**
+        * Holds transaction pointers of transactions.
+        * Queued pointer objects are owned.
+        */
+        TSglQue<TLinkableTransactionPtr> iTransactionPtrList;
+
+        /**
+        * Iterator for transaction queue
+        */        
+        TSglQueIter<TLinkableTransactionPtr> iTransactionPtrIter;
+        
+        /**
+        * Indicates whether or not this queue owns the transactions it holds.
+        */
+        TBool iOwned;
+        
+        /**
+        * Heap where the queue resides. 
+        * Transactions must reside in the same heap.
+        * Not own.
+        */
+        RHeap* iHeap;
+    };
+
+
+
+#endif // SENSRVTRANSACTIONQUEUE_H