localconnectivityservice/headset/src/finder.cpp
branchRCL_3
changeset 40 52a167391590
parent 0 c3e98f10fcf4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/localconnectivityservice/headset/src/finder.cpp	Wed Sep 01 12:20:40 2010 +0100
@@ -0,0 +1,244 @@
+/*
+* Copyright (c) 2004-2009 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:  Generic hid finder implementation
+ *
+*/
+
+
+#include <e32std.h>
+#include <e32svr.h>
+
+#include "finder.h"
+#include "debug.h"
+
+// ----------------------------------------------------------------------
+
+// Define this for additional debug output (this file only):
+#define EXTRA_DEBUG
+
+#ifdef EXTRA_DEBUG
+#define DBG(a) a;
+#else
+#define DBG(a)
+#endif
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// THeadsetFinder()
+// ---------------------------------------------------------------------------
+//
+THeadsetFinder::THeadsetFinder() :
+    iAppCollection( 0 ), iFieldList()
+    {
+    // Nothing else to do
+    }
+
+// --------------------------------------------------------------------------
+// From class MHidFieldFinder
+// BeginCollection()
+// --------------------------------------------------------------------------
+//
+TBool THeadsetFinder::BeginCollection( const CCollection* aCollection )
+    {
+    TBool examineCollection = ETrue;
+
+    const TInt KConsumerControl = 0x01;
+
+    // Only look at top-level application (consumer devices: consumer
+    // control) collections:
+    //
+
+    if ( ( aCollection->IsApplication() ) && ( iAppCollection == 0 ) )
+        {
+        // Top-level application collection.
+
+        if ( ( aCollection->UsagePage() == EUsagePageConsumer )
+                && ( aCollection->Usage() == KConsumerControl ) )
+            {
+            TRACE_INFO(_L("[HID]\tTHeadsetFinder::BeginCollection: this is \
+                    consumer collection "));
+            // Collection is a consumer device:
+            iAppCollection = aCollection;
+            iFieldList.Reset();
+            }
+        else
+            {
+            TRACE_INFO(_L("[HID]\tTHeadsetFinder::BeginCollection: not \
+                    consumer collection"));
+            // Skip other types of top-level application collection:
+            examineCollection = EFalse;
+            }
+        }
+    return examineCollection;
+
+    }
+
+// ---------------------------------------------------------------------------
+// From class MHidFieldFinder
+// EndCollection()
+// ---------------------------------------------------------------------------
+//
+TBool THeadsetFinder::EndCollection( const CCollection* aCollection )
+    {
+    TBool continueSearch = ETrue;
+
+    TRACE_INFO(_L("[HID]\tTHeadsetFinder::EndCollection"));
+    if ( aCollection == iAppCollection )
+        {
+        // Top-level application(Consumer Devices:Consumer Control) finished:
+        //
+        iAppCollection = 0;
+
+        // Stop if we've found a device we can use in this
+        // application collection:
+        //
+        continueSearch = !Found();
+        }
+
+    return continueSearch;
+    }
+
+// ---------------------------------------------------------------------------
+// From class MHidFieldFinder
+// Field()
+// ---------------------------------------------------------------------------
+//
+void THeadsetFinder::Field( const CField* aField )
+    {
+    TRACE_INFO((_L("[HID]\tTHeadsetFinder::Field( 0x%08x)"),aField));
+    TInt error = KErrNone;
+    if ( iAppCollection )
+        {
+
+        if ( IsTelephony( aField ) )
+            {
+            TRACE_INFO((_L("[HID]\tTHeadsetFinder::Field, telephony")));
+            error = iFieldList.Append( aField );
+            if ( error != KErrNone )
+                {
+                TRACE_INFO((_L("[HID]\tTHeadsetFinder::Field, telephony \
+                        failed")));
+                }
+            }
+        else if ( IsConsumer( aField ) )
+            {
+            TRACE_INFO(_L("[HID]\tTHeadsetFinder::Field, consumer"));
+            error = iFieldList.Append( aField );
+            if ( error != KErrNone )
+                {
+                TRACE_INFO((_L("[HID]\tTHeadsetFinder::Field, telephony \
+                        failed")));
+                }
+            }
+        else
+            {
+            TRACE_INFO(_L("[HID]\tTHeadsetFinder::Field, other, or empty \
+                    field"));
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// IsConsumer()
+// ---------------------------------------------------------------------------
+//
+TBool THeadsetFinder::IsConsumer( const CField* aField ) const
+    {
+    TBool found = EFalse;
+
+    if ( aField->IsInput() && aField->IsData() && ( aField->UsagePage()
+            == EUsagePageConsumer ) )
+        {
+#ifdef _DEBUG
+        for ( TInt i = 0; i < aField->UsageCount(); i++ )
+            {
+            TRACE_INFO((_L("[HID]\tTHeadsetFinder::IsConsumer: Usage %d: \
+                    %02x"),i,aField->Usage(i)));
+            }
+#endif
+            // *** Add usage test here ***
+        TRACE_INFO(_L("[HID]\tTHeadsetFinder::IsConsumer:  Consumer keys \
+                field found\r\n"));
+        found = ETrue;
+        }
+    return found;
+    }
+
+// ---------------------------------------------------------------------------
+// IsTelephony()
+// ---------------------------------------------------------------------------
+//
+TBool THeadsetFinder::IsTelephony( const CField* aField ) const
+    {
+    TBool found = EFalse;
+
+    if ( aField->IsInput() && aField->IsData() && ( aField->UsagePage()
+            == EUsagePageTelephony ) )
+        {
+        const TInt KHookSwitch = 0x20;
+        const TInt KPhoneMute = 0x2F;
+#ifdef _DEBUG
+        for ( TInt i = 0; i < aField->UsageCount(); i++ )
+            {
+            TRACE_INFO((_L("[HID]\tTHeadsetFinder::IsTelephony: \
+                    Usage %d: %02x"),i,aField->Usage(i)));
+            }
+#endif
+        if ( ( aField->UsageMin() <= KPhoneMute ) && ( aField->UsageMax()
+                >= KHookSwitch ) )
+            {
+            TRACE_INFO(_L("[HID]\tTHeadsetFinder::IsTelephony:  Telephony \
+                    field found"));
+            found = ETrue;
+            }
+        }
+    return found;
+    }
+
+// ---------------------------------------------------------------------------
+// EmptyList()
+// ---------------------------------------------------------------------------
+//
+void THeadsetFinder::EmptyList()
+    {
+    iFieldList.Reset();
+    }
+
+// ---------------------------------------------------------------------------
+// FieldCount()
+// ---------------------------------------------------------------------------
+//
+TInt THeadsetFinder::FieldCount()
+    {
+    return iFieldList.Count();
+    }
+
+// ---------------------------------------------------------------------------
+// GetFieldAtIndex()
+// ---------------------------------------------------------------------------
+//
+CField* THeadsetFinder::GetFieldAtIndex( TInt aIndex )
+    {
+    return iFieldList[aIndex];
+    }
+
+// ---------------------------------------------------------------------------
+// Found()
+// ---------------------------------------------------------------------------
+//
+TBool THeadsetFinder::Found() const
+    {
+    return ( iFieldList.Count() != 0 );
+    }