localconnectivityservice/generichid/src/hidreportroot.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 31 Aug 2010 16:03:15 +0300
branchRCL_3
changeset 19 0aa8cc770c8a
permissions -rw-r--r--
Revision: 201032 Kit: 201035

/*
* 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:  Reportroot implementation
*
*/


#include <e32debug.h>

#include "hidreportroot.h"
#include "debug.h"

const TInt KSevenBits  = 7;

// ======== MEMBER FUNCTIONS ========

// -----------------------------------------------------------------------------
// NewLC()
// -----------------------------------------------------------------------------
//
CReportRoot* CReportRoot::NewLC()
    {
    CReportRoot* self = new (ELeave) CReportRoot();
    CleanupStack::PushL(self);
    self->ConstructL();
    return self;
    }
// -----------------------------------------------------------------------------
// NewL()
// -----------------------------------------------------------------------------
//
CReportRoot* CReportRoot::NewL()
    {
    CReportRoot* self = NewLC();
    CleanupStack::Pop(self);
    return self;
    }
// -----------------------------------------------------------------------------
// ~CReportRoot()
// -----------------------------------------------------------------------------
//
CReportRoot::~CReportRoot()
    {
    iSizes.Reset();
    iSizes.Close();
    }
// -----------------------------------------------------------------------------
// CReportRoot()
// -----------------------------------------------------------------------------
//
CReportRoot::CReportRoot()
    {
    // Nothing to do here
    }



// -----------------------------------------------------------------------------
// IncrementReportSizeL()
// Manage the report ID <-> size "map":
// -----------------------------------------------------------------------------
//
void CReportRoot::IncrementReportSizeL(TInt aReportId,
    CField::TType aType, TInt aIncrement)
    {
    TInt index = FindReportSizeIndex(aReportId, aType);

    if ( index == KErrNotFound )
        {
        // Add a new entry for this report ID to the "map":
        User::LeaveIfError(iSizes.Append(TReportSize(aReportId, aType)));
        index = iSizes.Count() - 1;

        TRACE_INFO((_L("Adding size record for report %d:%d (%d)\n"),
                  aReportId, aType, iSizes[index].iSize));
        }
    TRACE_INFO((_L("Size for report %d:%d changes %d + %d\n"),
              aReportId, aType, iSizes[index].iSize, aIncrement));
    iSizes[index].iSize += aIncrement;
    }

// -----------------------------------------------------------------------------
// NumberOfReports()
// -----------------------------------------------------------------------------
//
TInt CReportRoot::NumberOfReports() const
    {
    return iSizes.Count();
    }
// -----------------------------------------------------------------------------
// ReportSize()
// -----------------------------------------------------------------------------
//
TInt CReportRoot::ReportSize(TInt aIndex) const
    {
    TInt size = 0;

    if (aIndex < iSizes.Count())
        {
        size = iSizes[aIndex].iSize;
        }

    return size;
    }
// -----------------------------------------------------------------------------
// ReportSize()
// -----------------------------------------------------------------------------
//
TInt CReportRoot::ReportSize(TInt aReportId, CField::TType aType) const
    {
    TInt offset = 0;

    TInt index = FindReportSizeIndex(aReportId, aType);
    if (index != KErrNotFound && index < iSizes.Count() )
        {
        offset = iSizes[index].iSize;
        }
    return offset;
    }

// -----------------------------------------------------------------------------
// ReportSizeBytes()
// -----------------------------------------------------------------------------
//
EXPORT_C TInt CReportRoot::ReportSizeBytes(TInt aReportId,
    CField::TType aType) const
    {
    TInt reportBytes = (ReportSize(aReportId, aType) + KSevenBits) / KSizeOfByte;

    // Add an extra byte if the report ID is used
    return ( aReportId ) ? reportBytes + 1 : reportBytes;
    }

// -----------------------------------------------------------------------------
// FindReportSizeIndex()
// -----------------------------------------------------------------------------
//
TInt CReportRoot::FindReportSizeIndex(TInt aReportId, CField::TType aType) const
    {
    TIdentityRelation<TReportSize> matcher(TReportSize::Match);
    TInt index = iSizes.Find(TReportSize(aReportId, aType), matcher);

    TRACE_INFO((_L("FindReportSizeIndex(%d, %d) = %d\n"),
              aReportId, aType, index));
    return index;
    }