/*
 * ObserwatorWatku.h
 *
 * Autor: Pawe Gala
 */

#ifndef OBSERWATORWATKU_H_
#define OBSERWATORWATKU_H_

#include <e32base.h>    // CActive


class MWlascicielWatku
{
    public:
        virtual void WykonanieWatkuZakonczone() = 0;
};

class CObserwatorWatku : public CActive
{
    public:        // Konstruktor dwufazowy i destruktor
        static CObserwatorWatku* NewL( RThread& aWatek, 
                        MWlascicielWatku& aWlascicielWatku )     ;
        ~CObserwatorWatku();
        
    public:
        void CzekajNaZakonczenie();
        
    private:    // Odziedziczone z CActive
        void DoCancel();
        void RunL();
        
    private:    // Konstruktory pierwszej i drugiej fazy
        void ConstructL();
        CObserwatorWatku( RThread& aWatek, MWlascicielWatku& aWlascicielWatku );
        
    private:    // Pola
        RThread& iWatek;
        MWlascicielWatku& iWlascicielWatku;
};

#endif /* OBSERWATORWATKU_H_ */


/*
 * ObserwatorWatku.cpp
 *
 * Autor: Pawe Gala
 */

#include "ObserwatorWatku.h"


CObserwatorWatku* CObserwatorWatku::NewL( RThread& aWatek, 
                        MWlascicielWatku& aWlascicielWatku )
{
    CObserwatorWatku* self = new( ELeave ) CObserwatorWatku( aWatek, aWlascicielWatku );
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );
    return self;
}

CObserwatorWatku::CObserwatorWatku( RThread& aWatek, MWlascicielWatku& aWlascicielWatku )
            :CActive( EPriorityStandard )
            ,iWatek( aWatek )
            ,iWlascicielWatku( aWlascicielWatku )
{
    CActiveScheduler::Add( this );
}

CObserwatorWatku::~CObserwatorWatku()
{
    Cancel();
}

void CObserwatorWatku::ConstructL()
{
    // Aktualnie implementacja nie jest wymagana.
}

void CObserwatorWatku::CzekajNaZakonczenie()
{
    Cancel();
    
    iWatek.Logon( iStatus );
    SetActive();
}
        
void CObserwatorWatku::DoCancel()
{
    iWatek.LogonCancel( iStatus );
}

void CObserwatorWatku::RunL()
{
    iWlascicielWatku.WykonanieWatkuZakonczone();
}

// ----------------
// Uycie klasy CObserwatorWatku
// ----------------

iObserwatorWatku = CObserwatorWatku::NewL( iWatek, *this );
iObserwatorWatku->CzekajNaZakonczenie();

// Po zakoczeniu wykonywania wtku wywoana zostanie metoda
// this::WykonanieWatkuZakonczone().
