--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetoothengine/btui/devmodel/inc/btdevmodel.h Mon Jan 18 20:28:57 2010 +0200
@@ -0,0 +1,304 @@
+/*
+* 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: Maintain a Bluetooth devices data model for UI components.
+*
+*/
+
+#ifndef BTDEVMODEL_H
+#define BTDEVMODEL_H
+
+#include <e32base.h>
+#include <btmanclient.h>
+#include <btdevice.h>
+#include <e32cmn.h>
+
+// used to support different device list of UI
+enum TBTDeviceGroup
+ {
+ EGroupPaired, // for paired device list
+ EGroupBlocked // for blocked device list
+ };
+
+// for showing left side icon of a device in device list. Based on CoD major device
+enum TBTDeviceType
+ {
+ EDeviceComputer = 0,// computer
+ EDevicePhone, // mobile phone
+ EDeviceAudio, // headset or loudspeakers
+ EDeviceCarkit, // audio-caraudio
+ EDevicePrinter, // imaging-printer
+ EDeviceKeyboard, // peripheral-keyboard
+ EDeviceMice, // peripheral-pointer
+ EDeviceGPS, // major service positioning
+ EDeviceDefault, // device of other type than define above.
+ };
+
+// for showing right side icon of a device on a device list
+enum TBTDeviceStatus
+ {
+ EStatusTrusted = 0x0001, // show authorised icon on both paired and blocked lists
+ EStatusBtuiConnected = 0x0002, // show connected icon on paired list
+ EStatusBlocked = 0x0004, // show device on blocked list
+ EStatusPaired = 0x0008, // show the device in paired devices list
+ EStatusConnectable = 0x0010, // The device can be connected to.
+ // NOTE: connected devices are also connectable,
+ // despite they cannot be connected before disconnect.
+ EStatusPhysicallyConnected = 0x0020 // Physical bluetooth connection.
+ };
+
+enum TBTDeviceOp
+ {
+ EOpPair,
+ EOpUnpair,
+ EOpBlock,
+ EOpUnblock,
+ EOpConnect,
+ EOpDisconnect,
+ EOpTrust,
+ EOpUntrust,
+ EOpChangeName,
+ EOpNone,
+ EOPInternalUntust // used by CBTDevModel internally
+ };
+
+/* TBTDevAddr that is not address of any device
+*/
+#define KNullAddress TBTDevAddr(TInt64(0))
+
+// contain all device info needed for shown on a device list
+NONSHARABLE_CLASS( TBTDevice )
+ {
+public:
+ /** Constructor, that initialized this as empty*/
+ IMPORT_C TBTDevice();
+ /** Copy constructor */
+ IMPORT_C TBTDevice(const TBTDevice& aDevice);
+ /** Copy */
+ IMPORT_C TBTDevice& operator=(const TBTDevice& aDevice);
+
+ TBTDeviceType iType; // left side icon
+ TBTDeviceClass iDeviceClass; // this is needed by connect
+ TBTDeviceName iName; // a formated friendly/device name in corresponding CBTDevice
+ TBTDeviceName iFriendlyName; // still need to remember if friendly name has been set
+ TUint iStatus; // mask of TDeviceStatus
+ TBTDeviceOp iOperation; // last operation on the device
+ TBTDevAddr iAddr; // bt device address
+ TInt iIndex; // new position of the device in the device list.
+ // Default value means iAddr should be used instead.
+ TBTLinkKeyType iLinkKeyType;
+ TNameEntry iNameEntry; // the device's EIR data
+ };
+/** Static methods for TBTDeviceComparison. These are meant to be given to TBTDeviceSortOrder and
+* to be used for defining sort orders.
+*/
+class TBTDeviceComparison
+ {
+public:
+ /**
+ * Compare function for alphabetic sorting order.
+ * @param aFirstDevice to be compared
+ * @param aSecondDevice sencond device to be compared
+ * @return 1 if aFirstDevice is before aSecondDevice -1 otherwise. May not return 0,
+ * on devices that are not the same.
+ */
+
+ IMPORT_C static TInt CompareAphabetically(
+ const TBTDevice& aFirstDevice, const TBTDevice& aSecondDevice) ;
+
+ /**
+ * Compare function for reverse alphabetic sorting order.
+ * @param aFirstDevice to be compared
+ * @param aSecondDevice sencond device to be compared
+ * @return 1 if aFirstDevice is before aSecondDevice -1 otherwise. May not return 0,
+ * on devices that are not the same.
+ */
+ IMPORT_C static TInt ReverseCompareAphabetically(
+ const TBTDevice& aFirstDevice, const TBTDevice& aSecondDevice) ;
+ };
+
+typedef RPointerArray<TBTDevice> RDeviceArray;
+typedef RPointerArray<TBTDeviceName> RBTDevNameArray;
+typedef TLinearOrder<TBTDevice> TBTDeviceSortOrder ;
+
+class CBTDevModelBase;
+
+/**
+* Callback interface for informing about the changes in the devices shown by the listening view.
+* Also a callback interface that informs the listener when the issued commands have been completed.
+*/
+class MBTDeviceObserver
+ {
+public:
+ /**
+ * Informs the observer that ChangeDevice command has been completed.
+ *
+ * The listener must not change the displaid devices, since RefreshDeviceList is used for that purpose.
+ * Also this will not be called, if changes happen from outside such as pairing initiated by 3rd party
+ * of blocking from notifier.
+ *
+ * @param aErr Symbian error code, KErrNone if no error.
+ * @param aDevice the device which is changed. This has allways given to the listener by RefreshDeviceList
+ * prior this call, if that device is visible at the listening view. This not passed by refrence,
+ * since this device could change, if registry is changed
+ * @param aDevNameArray hold conflicting devices' short names if "AlreadyExist" error happened during "connect"
+ * @return None.
+ */
+ virtual void NotifyChangeDeviceComplete(const TInt aErr, const TBTDevice& aDevice,
+ const RBTDevNameArray* aDevNameArray = NULL) = 0;
+
+ /**
+ * This is used to notify the listening graphic component that the deviceList is changed.
+ * After receiving this call the graphic component has to redraw its screen to match this list.
+ * @param aDevices The devices to be displaid.
+ * @param aSelectedItemIndex The index of the item to be selected in the given devices.
+ */
+ virtual void RefreshDeviceList(const RDeviceArray* aDevices,TInt aSelectedItemIndex) =0;
+
+ /**
+ * This is used before calling RefreshDeviceList to save the currently selected index,
+ * so that the same device could be selected after the refresh, if that device still exists.
+ * @param None.
+ * @return the selected device. KErrNotFound if the view has no devices.
+ */
+ virtual TInt CurrentItemIndex() =0;
+ };
+
+/**
+* This is a abstract class providing basic common fucntions for derived classes.
+* It act as a facade between UI applications and Bluetooth Engine Device Management API.
+*/
+NONSHARABLE_CLASS( CBTDevModel ) : public CBase
+ {
+public: // Constructors and destructor
+ /**
+ * Constructs devmodel.
+ * @param aGroup. do you wish to list other or blocked devices.
+ * @param MBTDeviceObserver The object that will receive the notifications for command completes,
+ * @param the order the devices are sorted in the list. If you do not give this the devices
+ * will be sorted in ascending alphabetic order. Devices with same name are sorted according to
+ * bluetooth addreses. DevModel will take the ownership of this object.
+ */
+ IMPORT_C static CBTDevModel* NewL(const TBTDeviceGroup aGroup,
+ MBTDeviceObserver* aObserver=NULL,
+ TBTDeviceSortOrder* aOrder=NULL);
+ /** Destructor */
+ virtual ~CBTDevModel();
+
+public: // New functions
+
+ /**
+ * Get device based on addr or index.
+ * @param aDevice the TBTDevice holder. The device address is passed in
+ * @return KErrNone if ok.
+ * KErrArgument, if neither index not address is filled.
+ * KErrOverFlow if index is out of range.
+ * KErrNotFound if the given address does not exists, in the internal array.
+ */
+ IMPORT_C TInt GetDevice(TBTDevice& aDevice);
+
+ /**
+ * Checks if any of the devices shown in view have active bluetooth connection.
+ * @return ETrue, if one or more devices are connected. EFalse if no devices are connected.
+ * This also return EFalse, in case of blocked devices.
+ */
+ IMPORT_C TBool IsAnyDeviceConnected();
+
+ /**
+ * Creates and allocates TBTDevice representation of this device.
+ * The caller is responsibe for the garbage connection of the created device.
+ * @param aRegDevice the device to be converted
+ * @return the TBTDevice representation of the same device
+ */
+ IMPORT_C TBTDevice* CreateDeviceL(const CBTDevice* aRegDevice,
+ TNameEntry* aNameEntry);
+
+ /**
+ * Change status of all devices on the list, e.g. used by unpair all and unblock all commands.
+ * @param aOperation unpair/unblock
+ * @return None.
+ */
+ IMPORT_C void ChangeAllDevices(const TBTDeviceOp aOperation);
+
+ /**
+ * Change device status, add device, e.g. pair/block, or delete device,e.g. unpair/unblcok
+ * You must not pair device without properly filling deviceName.
+ * @param aDevice the TBTDevice holder. The device address is passed in
+ * @return None
+ */
+ IMPORT_C void ChangeDevice(const TBTDevice& aDevice);
+
+ /**
+ * Change device status, add device, e.g. pair/block, or delete device,e.g. unpair/unblcok
+ * @param aDevice the CBTDevice holder.
+ * @return None.
+ */
+ IMPORT_C void ChangeDevice(const CBTDevice* aDevice,
+ TNameEntry* aNameEntry,
+ TBTDeviceOp aOp) ;
+
+ /**
+ * Cancel ongoing operation, such as connecting or pairing.
+ * At the moment btui does not support other Other operations than pairing and connecting cannot be canceled.
+ *
+ * @param aDevice the device, whose command is to be canceled.
+ * @return None.
+ */
+ IMPORT_C void CancelChange(const TBTDevice& aDevice);
+
+ /**
+ *Checks if there are ChangeDeviceCommands that are not finnished.
+ */
+ IMPORT_C TBool DeviceChangeInProgress();
+
+
+private:
+ /** constructor */
+ CBTDevModel();
+
+ /** Symbian 2nd phase constuctor that may leave.
+ * @param aGroup EGroupPaired and EGroupBlocked are supported.
+ * @param aObserver the observer of the device list. This is not mandatory
+ * @param aOrder The order the devices are sorted
+ */
+ void ConstructL(const TBTDeviceGroup aGroup,
+ MBTDeviceObserver* aObserver,
+ TBTDeviceSortOrder* aOrder );
+private:
+
+ CBTDevModelBase* iDevModel; // CBTDevModelPaired or CBTDevModel Blocked
+ TBTDeviceGroup iGroup;
+ };
+
+
+/** Adds flags to iStatus of TBTDevice.
+ *@param aStatus the status of the device
+ *@param aFlags the flags to be set
+ */
+inline TUint SetStatusFlags(TUint& aStatus,TBTDeviceStatus aFlags)
+ {
+ aStatus |=aFlags;
+ return aStatus;
+ }
+/** Clear status flags to iStatus of TBTDevice.
+ *@param aStatus the status of the device
+ *@param aFlags the flags to be set
+ */
+inline TUint UnsetStatusFlags(TUint& aStatus,TBTDeviceStatus aFlags)
+ {
+ aStatus &= ~aFlags;
+ return aStatus;
+ }
+
+#endif
+