bluetoothengine/btui/devmodel/inc/btdevmodelbase.h
branchRCL_3
changeset 23 9386f31cc85b
parent 0 f63038272f30
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetoothengine/btui/devmodel/inc/btdevmodelbase.h	Wed Sep 01 12:20:04 2010 +0100
@@ -0,0 +1,286 @@
+/*
+* Copyright (c) 2006-2007 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:  Abstract base class for concete models.
+*
+*/
+
+
+#ifndef BTDEVMODELBASE_H
+#define BTDEVMODELBASE_H
+
+#include <btengdevman.h>       // for MBTEngDevManObserver
+
+#include "btdevmodel.h"
+#include "btregistryobserver.h" // for MBTRegistryObserver
+
+/**
+* This is a abstract class providing basic common fucntions for derived classes.
+* It act as a mediator between UI applications and Bluetooth Engine Device Management API.
+*
+*@lib btdevmodel.dll
+*@since S60 V3.2
+*/
+NONSHARABLE_CLASS( CBTDevModelBase ): public CBase, public MBTEngDevManObserver, public MBTRegistryObserver
+    {
+public: // Constructors and destructor
+    /** destructor 
+    *@param none.
+    *@return none.
+    */
+    virtual ~CBTDevModelBase();       
+public: 
+
+	/** Checks if any of the devices shown in view have active bluetooth connection.
+	 * This baseclass does not support connections, so the answer is allways EFalse.
+	 *
+	 * NOTE: TBTUIViewsCommonUtils::IsAnyDeviceConnectedL will report also those devices
+	 * that are not part of particular view, such as paired devices.
+	 * CBTPairedModel::IsAnyDeviceConnected reports only connection from paired devices.
+	 *
+	 *@return ETrue, if one or more devices are connected. EFalse if no devices are connected.
+	 */
+	TBool virtual IsAnyDeviceConnected();
+    /**
+    * Get device based on addr or index.
+    * @param aDevice the TBTDevice holder. You have to set either the deviceAddress or the
+    * or the device index. If you specify both the device address and the index then the address is used,
+    * this includes those cases when there is no device corresponding the address.
+    * @return KErrNone if ok. 
+    * KErrArgument, if neither index not address is filled.
+    * KErrOverFlow if index is out of range. which means it is negative or the internal array does not have that
+    * many items.
+    * KErrNotFound if the given address does not exists, in the internal array.
+    */
+    TInt virtual GetDevice(TBTDevice& aDevice);
+       
+    /**
+    * Change status of all devices on the list. This is used by Delete All operations in paired devices view
+    * (EOpPair) and Blocked devices view(EOpUnblock)
+    *
+    * This creates multiple operations in the intergal queue that are all executed on by one.
+    *
+    * @param aOperation unpair/unblock
+    * @return None.
+    */
+    void ChangeAllDevices(const TBTDeviceOp aOperation);
+
+    /**
+    * Change device status, add device, e.g. block, unpair,unblock etc.
+    *
+    * The operation is put to queue and executed when the prior operations
+    * of the queue are finnished. Immeadiately if the queue is empty.
+    *
+    * @param aDevice. The device and the type of the change. If the address is empty, then the 
+    * device index means what device is to be used.
+    * @return none
+    */
+    virtual void ChangeDeviceL(const TBTDevice& aDevice);
+    
+    /**
+    * Change device status, add device, e.g. block, unpair,unblock etc.
+    * This will check for leaves and make a callback, if leave occurs.
+    *
+    * The operation is put to queue and executed when the prior operations
+    * of the queue are finnished. Immeadiately if the queue is empty.
+    *
+    * @param aDevice. The device and the type of the change. If the address is empty, then the 
+    * device index means what device is to be used.
+    * @return none
+    */
+    
+    virtual void ChangeDevice(const TBTDevice& aDevice);
+    
+    /**
+    * Cancel connecting, pairing, modifying device in BTRegistry
+    *
+    * Cancels ongoing operation or operation from queue, if it has not been started yet.
+    * Cancels it, if it is being executed. Used by Canceling Connecting and pairing operations.
+    *
+    * @param aDevice. The device and the type of the change that will be canceled. 
+    * If the address is empty, then the 
+    * device index means what device is to be used.
+    * @return None.
+    */
+    virtual void CancelChange(const TBTDevice& aDevice);
+    
+    /** Creates and allocates TBTDevice representation of this device
+     *@param aRegDevice the device to be converted,
+     *@param aNameEntry contains the EIR data of the device if its data is valid
+     *@return the TBTDevice representation of the same device. (Note the caller is responsible for deleting
+     * the returned item.)
+     */
+    virtual TBTDevice* CreateDeviceL(const CBTDevice* aRegDevice, 
+            TNameEntry* aNameEntry);    
+    
+	/** Checks if there are any ChangeDeviceCommands that are not finnished.
+	 *@return ETrue if the are one or more commands being executed or are in the execution queue.
+	 */
+	virtual TBool DeviceChangeInProgress();
+	
+	/** This is used to make callback to iObserver, when a leave has been detected.
+	*It will also clean up the partial operation.
+	*
+	*@param aErr the leave error code
+	*@param aDevice The device and operation that cause the leave.
+	* If this is inserted in the queue, it is deleted from there.
+	* If the leave occurred before inserting it to execution queue 
+	* (not common), then it will not deleted from there.
+	*@return none.
+	*/
+	virtual void HandleLeave(TInt aErr,const TBTDevice* aDevice );
+
+protected:
+    /**
+    * Change device status, add device, e.g. block, unpair,unblock etc.
+    *
+    * This is the operation that is used to to execute the operation queued by ChangeDevice.
+    *
+    * @param aDevice. The device and the type of the change. If the address is empty, then the 
+    * device index means what device is to be used.
+    * @return KerrNone or system wide error code.
+    */
+    virtual TInt DoChangeDeviceL(const TBTDevice& aDevice);    
+    
+    /**
+    * Cancel ongoing connecting, pairing, modifying device in BTRegistry
+    *
+    * This is the operation that is used to cancel ongoing operation.
+    *
+    * @param aDevice. The device and the type of the change that will be canceled. 
+    * If the address is empty, then the 
+    * device index means what device is to be used.
+    * @return None.
+    */   
+    virtual void DoCancelChangeL(const TBTDevice& aDevice);
+
+	/** This function recounts the indexes of iDeviceArray.
+	 *@return none.
+	 */
+	void RenumberDeviceArray();
+
+	/** Constructor 
+	 * @param aObserver The observer will receive information about command completes and
+	 * changes in the devices.
+	 * @param aOrder The order the devices are sorted. Default order is added by CBTDevMan, so
+	 * this class can assume this parameter to be used. This class is responsible for deleting this parameter on
+	 * its destructor.
+	 */
+    CBTDevModelBase(MBTDeviceObserver* aObserver,
+                    TBTDeviceSortOrder* aOrder );
+
+	/** Get the index for a device specified by bluetooth device address.
+	 *
+	 *@param aAddr the address of the searched device or KNullAddres.
+	 *@param aIndexIfNullAddress, if this parameter is defined this function 
+	 *returns this index instead of KErrNotFound, it the device has nullAddress.
+	 *@return index of the address. If the given address is KNullAddress then returns aIndexIfNullAddress or KErrNotFound if one is not specified by called.
+	 *This will allways return KErrNone if the given address is not a KNullAddress  and is not found.	 
+	 */
+    TInt GetIndexByAddress(const TBTDevAddr aAddr,TInt aIndexIfNullAddress=KErrNotFound);
+	    
+    /** Adds the TBTDevice representation of this device to iDeviceArray, if
+     * this device is of that type (paired/blocked) that this model supports.
+     * If the device is not that type, it will not be added.
+     *
+     * NOTE: This function is not guaranteed againt duplicates, so multiple
+     * additions of the same device will lead to multiple copies of it.
+     *
+     * Subclasses can also implement their version of this function to add information
+     * to the device objects, such as connection information.
+     *
+     * @param aRegDevice the device to be added (if not filtered).
+     * @param aNameEntry contains the EIR data of the device if its data is valid
+     * @aOperation the operation that this device will contain when added.
+     */
+    void AddDeviceL(const CBTDevice* aRegDevice, 
+            TNameEntry* aNameEntry,
+            const TBTDeviceOp aOperation=EOpNone);
+        
+    /** Replaces iDeviceArray contents with the given devices 
+     *@param aDeviceArray the devices that will be added to internal structures.
+     */
+    virtual void CreateDevicesL(const CBTDeviceArray* aDeviceArray);
+    
+    /** Adds the given device to internal structures of this class
+     * using AddDeviceL, if the device is such that it should not be listed by this
+     * class, then it is not added.
+     *
+     * Implementing is used to filter out devices that are not handled by particular view.
+     * 
+     * @param aNameEntry contains the EIR data of the device if its data is valid
+     */
+    virtual void HandleNewDeviceL(const CBTDevice* aRegDevice,
+            TNameEntry* aNameEntry) = 0;
+	
+	/** Sends refresh of list of shown devices to listener.
+	 *
+	 * @param aErr If this is not KErrNone, then this function
+	 * will send refresh to the listener. Allways send, if not specified. 
+	 * If this funtion is not KEerrNone, then the funtion does nothing.	
+	 * @param aSelectedItem. If this is specified, then select this item.
+	 * if not specified uses the same item that the listener used to have active.
+	 */
+	virtual void SendRefreshIfNoError(TInt aErr=KErrNone,TInt aSelectedItem = KErrNotSupported );
+	 
+protected:
+
+    /** This callback is used to to notify this call from completed changed from iDevMan.
+    * Inherited from MBTEngDevManObserver.
+    *
+    * This funtion will trap any leave if they may occur and report them as errors in the
+    * corresponfing device change operarion.
+    */
+    void HandleDevManComplete(TInt aErr); 
+        
+    /** Inherited from BTEng's MBTEngDevManObserver, and implemented as empty,    
+    * because we do ask devicelists directly from iDevman, but trough iRegistryObserver->Refresh()
+    */
+    void HandleGetDevicesComplete(TInt aErr, CBTDeviceArray* aDeviceArray); 
+
+    /** This callback is used by iRegistryObserver to notify device changes, that
+     * originate both from changes of the BTRegistry as well as refreshes requested
+     * by this class. 
+     * @aDeviceArray the devices that the registry observer gets.
+     */
+    void RegistryChangedL(const CBTDeviceArray* aDeviceArray);
+
+	/** Check if there is allready one or more devices with this name.
+	 *@return ETrue if there is.
+	 */
+    TBool IsNameExisting(const TDesC& aName);
+    
+    /** Executes the next one in the queue, if any.
+    * Leaves are trapped by this class and send as failed commands to iObserver
+    * using HandleLeave.
+	*@param none.
+	*@return none.
+    */
+	void HandleQueue();    
+		
+protected: // Data
+    MBTDeviceObserver* iObserver;	// the listener of the completed commands and registry changes.
+    CBTEngDevMan* iDevMan;			// This is used to change the devices.
+    TBTDeviceSortOrder* iSortOrder;	// The order the devices are sorted to.    				
+    RDeviceArray iDeviceArray;		// The list of current devices.
+    CBTRegistryObserver* iRegistryObserver;	// This takes care of sending the devicelist to us each time 
+    										// something may have been changes.
+    TBTRegistrySearch iSearchPattern; // the pattern iRegistrySearch uses in retrieving devicelist.
+    								  // NOTE: HandleDeviceL is used to filter the results.
+    TBool iIsChangeAll;    
+    TBTDevice* iDevice;				 // the currently changed device, if any
+    RDeviceArray iQueue;			// The queue of commands to be executed
+    };
+  
+#endif // BT_DEV_MODEL_BASE_H
+