bluetoothengine/btserviceutil/inc/basicdevdiscoverer.h
author hgs
Mon, 03 May 2010 14:36:07 +0300
changeset 29 48ae3789ce00
permissions -rw-r--r--
201017_2

/*
* Copyright (c) 2010 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:  Declares Bluetooth device inquiry helper class.
*
*/

#ifndef BASICDEVDISCOVERER_H
#define BASICDEVDISCOVERER_H

#include <btdevice.h>
#include <bt_sock.h>
#include <btservices/btsimpleactive.h>

class MDevDiscoveryObserver;

class CDeviceSearchRecord : public CBase
    {
public:
    TInquirySockAddr iAddr;
    TBTDeviceName iName;
    };

/**
* A basic implementation for searching nearby Bluetooth devices.
*/
NONSHARABLE_CLASS(CBasicDevDiscoverer) : public CBase, public MBtSimpleActiveObserver
    {
public:

    /**
     * factory method
     */
    static CBasicDevDiscoverer* NewL( MDevDiscoveryObserver& aObserver );
    
    /**
    * Destructor.
    */
    virtual ~CBasicDevDiscoverer();
    
    /**
     * sets the inquiry result observer.
     * 
     * @param aObserver the new observer to receive inquiry results
     */
    void SetObserver( MDevDiscoveryObserver& aObserver );
    
    /**
    * Cancels all inquiry activity.
    */
    void Cancel();
    
    /**
    * Discover currently in-range devices that matches the given major device class type.
    * Found devices will be informed by 
    * MDevDiscoveryObserver::HandleNextDiscoveryResult().
    * 
    * When no device can be found any more, 
    * MDevDiscoveryObserver::HandleDiscoveryCompleted() will be issued.
    * 
    * @param aDeviceClass the major device class device must match.
    */
    void DiscoverDeviceL( TBTMajorDeviceClass aDeviceClass  = EMajorDeviceMisc );
    
private: // from MBtSimpleActiveObserver
    
    /**
     * Callback to notify that an outstanding request has completed.
     *
     * @param aActive Pointer to the active object that completed.
     * @param aStatus The status of the completed request.
     */
    void RequestCompletedL( CBtSimpleActive* aActive, TInt aStatus );
    
    /**
     * Callback for handling cancelation of an outstanding request.
     *
     * @param aId The ID that identifies the outstanding request.
     */
    void CancelRequest( TInt aId );
    
    /**
     * Callback to notify that an error has occurred in RunL.
     *
     * @param aActive Pointer to the active object that completed.
     * @param aError The error occurred in RunL.
     */
    void HandleError( CBtSimpleActive* aActive, TInt aError );
    
private:
    
    /**
    * C++ default constructor.
    */
    CBasicDevDiscoverer( MDevDiscoveryObserver& aObserver );
    
    /**
    * The 2nd phase constructor
    */
    void ConstructL();

    /*
     * retrieves the device name of the device pointed by 
     * iPagingNamePos to local array.
     */
    void PageNextDeviceName();
    
    /**
     * Performs the result from an inquiry operation.
     */
    TInt HandleInquiryResultL();
    
    /**
     * Create a heap object of CDeviceSearchRecord.
     */
    CDeviceSearchRecord* NewInstanceL( 
        const TInquirySockAddr& aAddr, const TDesC& aName = KNullDesC );

    /**
     * resets the state and memory caused by a client request.
     */
    void Reset();
    
private:  // Data

    // Not own
    MDevDiscoveryObserver& iObserver; 
    
    // The major device class filter from the client.
    TBTMajorDeviceClass iMajorDeviceClassFilter;
    
    // For inquiry and paging names:
    CBtSimpleActive* iActive;

    RSocketServ iSocketServer;
    RHostResolver iHostResolver;
    TInquirySockAddr iInquirySockAddr;
    TNameEntry iEntry; // Inquiry result record
    
    // Devices found so far
    RPointerArray<CDeviceSearchRecord> iDevices;
    
    // position in array iDevices: the item the current name paging operation is for
    TInt iPagingNamePos;

    };

#endif

// End of File