connectionmonitoring/connmon/connectionmonitor/src/ConnMonWLANNetworksArrayPckg.cpp
author Simon Howkins <simonh@symbian.org>
Thu, 18 Nov 2010 15:05:52 +0000
branchRCL_3
changeset 76 40780c2f3a6b
parent 0 5a93021fdf25
permissions -rw-r--r--
Adjusted to avoid exports, etc, from a top-level bld.inf

/*
* Copyright (c) 2006 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:  A package class for TConnMonWLANNetwork objects.
*
*/


#include <e32std.h>
#include "log.h"
#include "connmonwlannetwork.h"

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

// ---------------------------------------------------------------------------
// Construction
// ---------------------------------------------------------------------------
//
ConnMonWLANNetworksArrayPckg::ConnMonWLANNetworksArrayPckg(
        const RArray<TConnMonWLANNetwork>& aRef,
        TUint aBufLen )
    {
    LOGENTRFN("ConnMonWLANNetworksArrayPckg::ConnMonWLANNetworksArrayPckg()")

    RPointerArray<HBufC> items;
    LOGIT1("ConnMonWLANNetworksArrayPckg::ConnMonWLANNetworksArrayPckg: buflen <%d>", aBufLen )
    TUint len( 0 );
    LOGIT1("ConnMonWLANNetworksArrayPckg::ConnMonWLANNetworksArrayPckg: aRef.Count() <%d>", aRef.Count() )

    for ( TUint i = 0; i < aRef.Count(); ++i )
        {
        LOGIT1("ConnMonWLANNetworksArrayPckg::ConnMonWLANNetworksArrayPckg: i <%d>", i )

        const HBufC* item( aRef[i].ToBuf() );
        if ( item )
            {
            LOGIT1("ConnMonWLANNetworksArrayPckg::ConnMonWLANNetworksArrayPckg: Item->Length=<%d>", item->Length() )
            // Is there room in buffer
            TUint countFields( 3 ); // aRef.Count(); items->Count(); item->Length()
            if ( ( countFields + len + item->Length() ) > aBufLen )
                {
                LOGIT2("ConnMonWLANNetworksArrayPckg::ConnMonWLANNetworksArrayPckg: Not enough space to add item. Current len <%d>, item size <%d>", len, item->Length() )
                delete item;
                item = NULL;
                break;
                }
            LOGIT("ConnMonWLANNetworksArrayPckg::ConnMonWLANNetworksArrayPckg: Appending")
            items.Append( item );

            LOGIT1("ConnMonWLANNetworksArrayPckg::ConnMonWLANNetworksArrayPckg: len <%d>", len )
            ++(len+=item->Length()); // ++ is for item's size
            }
        else
            {
            LOGIT("ConnMonWLANNetworksArrayPckg::ConnMonWLANNetworksArrayPckg: Null Item!")
            }
        }

    // Check that given buflen (aBufLen) is not smaller than one
    // item (TConnMonWLANNetwork) + aRef count + items count
    // + item length
    if ( items.Count() == 0 && aRef.Count() > 0 )
        {
        aBufLen = 2; // aRef.Count(), items.Count()
        }

    iBuf = HBufC::New( aBufLen ); // Set size exactly to a buffer length
    LOG(_LIT( KPanicMessage, "ConnMonWLANNetworksArrayPckg::ConnMonWLANNetworksArrayPckg:" );)
    __ASSERT_DEBUG( iBuf, User::Panic( KPanicMessage, KErrNoMemory ) );

    if ( !iBuf )
        {
        items.ResetAndDestroy();
        items.Close();
        return;
        }

    LOGIT1("ConnMonWLANNetworksArrayPckg::ConnMonWLANNetworksArrayPckg: iBuf->Length() <%d>", iBuf->Length() )

    iBuf->Des().Append( aRef.Count() ); // Total amount of data
    iBuf->Des().Append( items.Count() );  // Amount of transferring data

    LOGIT1("ConnMonWLANNetworksArrayPckg::ConnMonWLANNetworksArrayPckg: iBuf->Length() <%d>", iBuf->Length() )

    for ( TUint i = 0; i < items.Count(); ++i )
        {
        LOGIT1("ConnMonWLANNetworksArrayPckg::ConnMonWLANNetworksArrayPckg: i <%d>", i )
        iBuf->Des().Append( items[i]->Length() );
        LOGIT1("ConnMonWLANNetworksArrayPckg::ConnMonWLANNetworksArrayPckg: iBuf->Length() <%d>", iBuf->Length() )
        iBuf->Des().Append( *items[i] );
        LOGIT1("ConnMonWLANNetworksArrayPckg::ConnMonWLANNetworksArrayPckg: iBuf->Length() <%d>", iBuf->Length() )
        }

    items.ResetAndDestroy();
    items.Close();

    LOGEXITFN("ConnMonWLANNetworksArrayPckg::ConnMonWLANNetworksArrayPckg()")
    }

// ---------------------------------------------------------------------------
// Construction
// ---------------------------------------------------------------------------
//
EXPORT_C ConnMonWLANNetworksArrayPckg::ConnMonWLANNetworksArrayPckg(
        TUint aBufSize )
    {
    iBuf = HBufC::New( aBufSize );
    LOG(_LIT( KPanicMessage, "ConnMonWLANNetworksArrayPckg::ConnMonWLANNetworksArrayPckg:" );)
    __ASSERT_DEBUG( iBuf, User::Panic( KPanicMessage, KErrNoMemory ) );
    }

// ---------------------------------------------------------------------------
// Destruction
// ---------------------------------------------------------------------------
//
EXPORT_C ConnMonWLANNetworksArrayPckg::~ConnMonWLANNetworksArrayPckg()
    {
    delete iBuf;
    iBuf = NULL;
    }

// ---------------------------------------------------------------------------
// Unpacking
// ---------------------------------------------------------------------------
//
EXPORT_C void ConnMonWLANNetworksArrayPckg::UnpackToL(
        RArray<TConnMonWLANNetwork>& aRef ) const
    {
    if ( !iBuf )
        {
        User::Leave( KErrBadDescriptor );
        }

    TUint pointer( 0 );

    TUint total( (*iBuf)[pointer++] ); // Total amount of data
    TUint count( (*iBuf)[pointer++] ); // Amount of transferred data

    for ( TUint i = 0; i < count; ++i )
        {
        TUint len( (*iBuf)[pointer++] );
        TPtrC ptrc( iBuf->Mid( pointer, len ) );
        User::LeaveIfError( aRef.Append( TConnMonWLANNetwork::FromPtrC( ptrc ) ) );
        pointer += len;
        }
    }

// ---------------------------------------------------------------------------
// Getter
// ---------------------------------------------------------------------------
//
EXPORT_C HBufC* ConnMonWLANNetworksArrayPckg::Buf() const
    {
    return iBuf;
    }

// End-of-file