/** Copyright (c) 2004-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: Declares main application class.**/#ifndef C_GENERICHID_H#define C_GENERICHID_H#include <hidinterfaces.h>class CDriverListItem;class TElement;class CParser;class CReportRoot;class CConnectionInfo;/** * * Generic HID main class * Generic HID layer, allowing the HID Transport layers and device drivers to * pass data to the Generic HID * * @lib generichid.lib * @since S60 v5.0 */class CGenericHid : public CHidTransport, public MDriverAccess {public: virtual ~CGenericHid(); /** * Constructs a generic HID layer with a reference to the owner so commands can * be sent to connected devices * * @since S60 v5.0 * @param aTransportLayer The owning transport layer * @return a Pointer to an instantiated Generic HID layer */ IMPORT_C static CGenericHid* NewL(MTransportLayer* aTransportLayer); /** * Constructs a generic HID layer with a reference to the owner so commands can * be sent to connected devices * * @since S60 v5.0 * @param aTransportLayer The owning transport layer * @return a Pointer to an instantiated Generic HID layer */ IMPORT_C static CGenericHid* NewLC(MTransportLayer* aTransportLayer); /** * Fromm class MDriverAccess * Retrieves the country code for the HID device * * @since S60 v5.0 * @param aConnectionID The device identifier * @return a country code */ TUint CountryCodeL(TInt aConnectionID); /** * Fromm class MDriverAccess * Retrieves the country code for the HID device * * @since S60 v5.0 * @param aConnectionId The device identifier * @return a vendor ir */ TUint VendorIdL(TInt aConnectionId); /** * Fromm class MDriverAccess * Retrieves the product identifier for the HID device * * @since S60 v5.0 * @param aConnectionId The device identifier * @return a prodcut id */ TUint ProductIdL(TInt aConnectionId); /** * Fromm class MDriverAccess * Sets the protocol to be used for reports. * Leaves KErrInUse The request was not successful because the * transport layer is busy with a previous request, * KErrNotReady The request failed because the device * is currently unavailable and KErrNotFound The request * was unsuccessful * * @since S60 v5.0 * @param aConnectionId The device identifier * @param aInterface The device interface being used by the driver * @param aProtocol The requested report protocol (boot or report) * @parem aDriver Calling driver * @return None. */ void SetProtocolL(TInt aConnectionId, TUint16 aInterface, MDriverAccess::TProtocols aProtocol, CHidDriver* aDriver); /** * Fromm class MDriverAccess * Requests the current protocol from the HID device. This is an asynchronous * request. The protocol value will come through at a later time * * @since S60 v5.0 * @param aConnectionId The device identifier * @param aInterface The hid interface * @return None. */ void GetProtocolL(TInt aConnectionId, TUint16 aInterface); /** * Fromm class MDriverAccess * A request for a report from the device. This is an asynchronous request. * The report will come through at a later time * * @since S60 v5.0 * @param aConnectionId The device identifier * @param aReportId report id to be get * @param aInterface The device interface being used by the driver * @param aLength report lenght * @return None. */ void GetReportL(TInt aConnectionId, TUint8 aReportId, TUint16 aInterface, TUint16 aLength); /** * Fromm class MDriverAccess * A request to send a report payload to the HID device * Leaves whit KErrInUse The request was not successful because the transport * layer is busy with previous request and KErrNotReady The request failed * because the device is currently unavailable * * @since S60 v5.0 * @param aConnectionId The device ID * @param aReportId The report id * @param aReportType Type of report (input/output/feature) * @param aPayload The report containing the device setup packet * @param aInterface The device interface being used by the driver * @parem aDriver Calling driver * @return None. */ void SetReportL(TInt aConnectionId, TUint8 aReportId, MDriverAccess::TReportType aReportType, const TDesC8& aPayload, TUint16 aInterface, CHidDriver* aDriver); /** * Fromm class MDriverAccess * A request to send a report payload to the HID device in Interrupt Channel * Leaves whit KErrInUse The request was not successful because the transport * layer is busy with previous request and KErrNotReady The request failed * because the device is currently unavailable * * @since S60 v5.0 * @param aConnectionId The device ID * @param aReportId report id which payload to be send * @param aPayload The report containing the device setup packet * @param aInterface The device interface being used by the driver * @return None. */ void DataOutL(TInt aConnectionId, TUint8 aReportId, const TDesC8& aPayload, TUint16 aInterface); /** * Fromm class MDriverAccess * Request for the current idle setting for the device * This is an asynchronous request. The idle value will come through at a * later time. Leaves whit KErrInUse The request was not successful because the transport * layer is busy with previous request and KErrNotReady The request failed * because the device is currently unavailable * * @since S60 v5.0 * @param aConnectionId The device identifier * @param aReportId The report ID for which we want the idle rate * @param aInterface The device interface being used by the driver * @return None. */ void GetIdleL(TInt aConnectionId, TUint8 aReportId, TUint16 aInterface); /** * Fromm class MDriverAccess * Request to the HID device to set the specified idle rate * A request to send a report payload to the HID device * Leaves whit KErrInUse The request was not successful because the transport * layer is busy with previous request and KErrNotReady The request failed * because the device is currently unavailable * * @since S60 v5.0 * @param aConnectionId The device ID * @param aDuration The number of 0.04ms intervals to wait between reports * @param aReportId The report for which the idle rate is being set * @param aInterface The device interface being used by the driver * @parem aDriver Calling driver * @return None. */ void SetIdleL(TInt aConnectionId, TUint8 aDuration, TUint8 aReportId, TUint16 aInterface, CHidDriver* aDriver); /** * From class CHidTransport * Called by the transport layers to inform the generic HID of the success of * the last Set... command. * * @since S60 v5.0 * @param aConnectionId The device ID * @param aCmdAck Status of the last Set... command * @return None. */ void CommandResult(TInt aConnectionId, TInt aCmdAck); /** * From class MDriverAccess * Gives the device driver access to the results of the report * descriptor parsing * * @since S60 v5.0 * @param aConnectionId The device ID * @return A pointer to the parsed descriptor object. */ CReportRoot* ReportDescriptor(TInt aConnectionId); /** * From class CHidTransport * Called by a transport layer when a device has connected and the report * descriptors have been obtained * * @since S60 v5.0 * @param aConnectionId The tansport-layer enumeration for the connection * @param aDescriptor The report descriptor for the connected HID device * @return KErrNone if a driver was found, otherwise an error code */ TInt ConnectedL(TInt aConnectionId, const TDesC8& aDescriptor); /** * From class CHidTransport * Called by a transport layer when a device has been disconnected * * @since S60 v5.0 * @param aConnectionId The tansport-layer enumeration for the connection * @return KErrNone if a driver was found, otherwise an error code */ TInt Disconnected(TInt aConnectionId); /** * From class CHidTransport * Called by the transport layer when a device has sent a report on the * interrupt or control channel * * @since S60 v5.0 * @param aConnectionId The tansport-layer enumeration for the connection * @param aChannel Channel ID (Interrupt or Control) * @param aPayload The complete report payload * @return KErrNone if the data was handled by the driver, otherwise an error code */ virtual TInt DataIn(TInt aConnectionId, CHidTransport::THidChannelType aChannel, const TDesC8& aPayload); /** * From class CHidTransport * Called by the transport layer to suspend or resume a driver * * @since S60 v5.0 * @param aConnectionId The tansport-layer enumeration for the connection * @param aActive EActive to start the driver(s), ESuspend to suspend * @return KErrNone if the driver was successfully activated, otherwise an error code */ TInt DriverActive(TInt aConnectionId, CHidTransport::TDriverState aActive);protected: CGenericHid(MTransportLayer* aTransportLayer); void ConstructL();private: /** * Remove drivers * * @since S60 v5.0 * @return None */ void RemoveDrivers(); /** * Attempts to find a driver that is handling reports from the HID device * * @since S60 v5.0 * @return Connection information */ CConnectionInfo* SeekConnectionInfo(TInt aConnectionId);private: /** * Instantiated driver list */ TSglQue<CDriverListItem> iDriverList; /** * Parser * Own. */ CParser* iParser; /** * Parser * Not own. */ MTransportLayer* iTransportLayer; /** * Connection information */ RPointerArray<CConnectionInfo> iConnectionInfo; /** * Input data handling registry * Own. */ CHidInputDataHandlingReg* iInputHandlingReg; };#endif