cbs/CbsServer/ClientSrc/RCbsTopicCollection.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 01:11:09 +0200
changeset 0 ff3b6d0fd310
permissions -rw-r--r--
Revision: 201003 Kit: 201005

/*
* Copyright (c) 2003 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:  This module contains the implementation of RCbsTopicCollection class 
                 member functions.
*
*/


// INCLUDE FILES

#include "CbsServerConstants.h"
#include "RCbs.h"
#include "RCbsTopicCollection.h"

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

// -----------------------------------------------------------------------------
// RCbsTopicCollection::RCbsTopicCollection
// C++ default constructor can NOT contain any code, that
// might leave.
// -----------------------------------------------------------------------------
//
RCbsTopicCollection::RCbsTopicCollection() 
    : iIterator( 0 )
    {   
    }

// -----------------------------------------------------------------------------
// RCbsTopicCollection::Open
// Creates a subsession to the server.
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
TInt RCbsTopicCollection::Open( 
    RCbs& aServer  )
    {
    // Open the subsession.
    const TIpcArgs args( TIpcArgs::ENothing );
    return CreateSubSession( aServer, ECbsCreateTopicCollectionSubsession, args );
    }

// -----------------------------------------------------------------------------
// RCbsTopicCollection::Close
// Closes a subsession to the server.
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
TInt RCbsTopicCollection::Close()
    {
    // Close the subsession
    RSubSessionBase::CloseSubSession( ECbsCloseTopicCollectionSubsession );
    return KErrNone;
    }

// -----------------------------------------------------------------------------
// RCbsTopicCollection::GetTopicCount
// Returns the total amount of topic information the topic collection
// contains.
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void RCbsTopicCollection::GetTopicCount( 
    TInt& aCount )
    {
    // Get the topic count from the server
    TPckgBuf< TInt > pckgCount;
    const TIpcArgs args( &pckgCount );
    SendReceive( ECbsGetTopicInfoCount, args );
    aCount = pckgCount();
    }

// -----------------------------------------------------------------------------
// RCbsTopicCollection::GetTopicInfo
// Returns a topic information structure.
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
TInt RCbsTopicCollection::GetTopicInfo( 
    TInt aIndex, 
    TCbsTopicInfo& aInfo )
    {
    // Get topic information from the server
    TPckgBuf< TCbsTopicInfo > pckgInfo( aInfo );
    const TIpcArgs args( aIndex, &pckgInfo );
    TInt result( SendReceive( ECbsGetTopicInfo, args ) );

    if ( result == KErrNone )
        {
        aInfo = pckgInfo();
        }
    return result;    
    }

// -----------------------------------------------------------------------------
// RCbsTopicCollection::NotifyOnChange
// Notifies the client next time when topic collection changes.
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void RCbsTopicCollection::NotifyOnChange( 
    TRequestStatus& aStatus )
    {
    // Send notification on change
    const TIpcArgs args( TIpcArgs::ENothing );
    SendReceive( ECbsNotifyOnChange, args, aStatus );
    }

// -----------------------------------------------------------------------------
// RCbsTopicCollection::NotifyOnChangeCancel
// Cancels the pending request to notify.
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void RCbsTopicCollection::NotifyOnChangeCancel()
    {
    // Cancel pending notification request.
    const TIpcArgs args( TIpcArgs::ENothing );
    SendReceive( ECbsNotifyOnChangeCancel, args );
    }

// -----------------------------------------------------------------------------
// RCbsTopicCollection::Start
// Interface for topic collection browsing. Resets the iterator.
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void RCbsTopicCollection::Start()
    {
    iIterator = 0;
    }

// -----------------------------------------------------------------------------
// RCbsTopicCollection::HasNextTopic
// Returns ETrue, if the topic collection has topic identities 
// unaccessed with NextTopic().
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
TBool RCbsTopicCollection::HasNextTopic()
    {
    TInt count( 0 );
    TInt result( KErrNone );
    TBool inList( EFalse );

    GetTopicCount( count );
    for ( ; iIterator < count; iIterator++ )
        {
        // Check if the current topic is in the topic list.
        result = TopicInList( iIterator, inList );
        if ( result != KErrNone )
            {
            return EFalse;
            }
        else if ( !inList )  
            {
            return ETrue;   // this topic is not in the list; 
            }
        }

    return EFalse;
    }

// -----------------------------------------------------------------------------
// RCbsTopicCollection::NextTopic
// Returns the next topic identity if one exists.
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
TInt RCbsTopicCollection::NextTopic( 
    TCbsTopicInfo& aInfo )
    {
    // iIterator points to the next unlisted topic: return the topic 
    // and error code.
    TInt result( KErrNone );
    result = GetTopicInfo( iIterator, aInfo );
    if ( result == KErrNone )
        {
        iIterator++;    // advance to the next topic
        }
    return result;
    }

// -----------------------------------------------------------------------------
// RCbsTopicCollection::TopicInList
// Returns information whether the topic was in topic list.
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
TInt RCbsTopicCollection::TopicInList( 
    TInt aIndex, 
    TBool& aInList )
    {
    // value returned by the server gets stored here
    TPckgBuf< TBool > pckgInList;
    const TIpcArgs args( aIndex, &pckgInList );

    TInt result = SendReceive( ECbsTopicInList, args );
    if ( result == KErrNone )
        {
        aInList = pckgInList();
        }
    
    return result;
    }

// ========================== OTHER EXPORTED FUNCTIONS =========================

//  End of File