/*
* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "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: 
*
*/



// INCLUDE FILES
#include    "dpdef.h"                   // dataport definitions
#include    "dpobserver.h"              // abstract observer class
#include    "dplog.h"                   // dataport logging
#include "OstTraceDefinitions.h"
#ifdef OST_TRACE_COMPILER_IN_USE
#include "dpobserverTraces.h"
#endif

// EXTERNAL DATA STRUCTURES
// none

// EXTERNAL FUNCTION PROTOTYPES
// none

// CONSTANTS
const TInt CDpObserver::iOffset = _FOFF(CDpObserver,iSlink);

// MACROS
// none

// LOCAL CONSTANTS AND MACROS
// none

// MODULE DATA STRUCTURES
// none

// LOCAL FUNCTION PROTOTYPES
// none

// FORWARD DECLARATIONS
// none

// ============================= LOCAL FUNCTIONS ===============================

// none


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

// ---------------------------------------------------------
// CDpObserver::CDpObserver
// C++ default constructor.
// ---------------------------------------------------------
CDpObserver::CDpObserver()
    {
    OstTrace0( TRACE_NORMAL, CDPOBSERVER_CDPOBSERVER, "CDpObserver::CDpObserver" );
    }

// ---------------------------------------------------------
// CDpObserver::~CDpObserver
// Destructor
// ---------------------------------------------------------
CDpObserver::~CDpObserver()
    {
    OstTrace0( TRACE_NORMAL, DUP1_CDPOBSERVER_CDPOBSERVER, "CDpObserver::~CDpObserver" );
    iSlink.iNext = NULL;
    }

//=============================================================================


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

// ---------------------------------------------------------
// CDpSubject::CDpSubject
// C++ default constructor.
// ---------------------------------------------------------
CDpSubject::CDpSubject() :
    iObserverList( CDpObserver::iOffset ),
    iObserverIter( iObserverList )
    {
    OstTrace0( TRACE_NORMAL, CDPSUBJECT_CDPSUBJECT, "CDpSubject::CDpSubject" );
    LOGM(" CDpSubject::CDpSubject");
    }

// ---------------------------------------------------------
// CDpSubject::~CDpSubject
// Destructor
// ---------------------------------------------------------
CDpSubject::~CDpSubject()
    {
    OstTrace0( TRACE_NORMAL, DUP1_CDPSUBJECT_CDPSUBJECT, "CDpSubject::~CDpSubject" );
    LOGM(" CDpSubject::~CDpSubject");

    CDpObserver* item= NULL;

    // set observer to first item in the list
    iObserverIter.SetToFirst();

    while( NULL != (item = iObserverIter++) )
        {
        iObserverList.Remove( *item );
        }
    }

// ---------------------------------------------------------
// CDpSubject::Attach
// Attach observer to this subject
// ---------------------------------------------------------
//
void CDpSubject::Attach(
    CDpObserver& aObserver)
    {
    OstTrace0( TRACE_NORMAL, CDPSUBJECT_ATTACH, "CDpSubject::Attach" );
    LOGM(" CDpSubject::Attach");
    iObserverList.AddLast( aObserver );
    }

// ---------------------------------------------------------
// CDpSubject::Detach
// Detach observer from this subject
// ---------------------------------------------------------
//
void CDpSubject::Detach(
    CDpObserver& aObserver)
    {
    OstTrace0( TRACE_NORMAL, CDPSUBJECT_DETACH, "CDpSubject::Detach" );
    LOGM(" CDpSubject::Detach");

    iObserverList.Remove( aObserver );
    }

// ---------------------------------------------------------
// CDpSubject::Notify
// Notify all observers of this subject object
// i.e. call UpDate() in every observer object.
// ---------------------------------------------------------
//
void CDpSubject::Notify()
    {
    OstTrace0( TRACE_NORMAL, CDPSUBJECT_NOTIFY, "CDpSubject::Notify" );
    LOGM(" CDpSubject::Notify");

    CDpObserver* item = NULL;
    iObserverIter.SetToFirst();
    while( NULL != (item = iObserverIter++) )
        {
        item->UpDate( this );
        }
    }

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

//  End of File
