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

#ifndef SYNCHRONIZATOR_H_
#define SYNCHRONIZATOR_H_

#include <e32base.h>    // CActive


class CSynchronizator : public CActive
    {
public:        // Konstruktory dwufazowe i destruktor
    static CSynchronizator* NewL();
    static CSynchronizator* NewLC();
    
    virtual ~CSynchronizator();
    
public:
    void Czekaj();

protected:    // Konstruktory pierwszej i drugiej fazy
    CSynchronizator();
    void ConstructL();
    
private:    // Odziedziczone z CActive
    void DoCancel();
    void RunL();
    
private:    // Pola
    CActiveSchedulerWait* iPetlaZarzAkt;
    };

#endif /* SYNCHRONIZATOR_H_ */


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

#include "Synchronizator.h"


CSynchronizator* CSynchronizator::NewL()
    {
    CSynchronizator* self = CSynchronizator::NewLC();
    CleanupStack::Pop( self );
    return self;
    }

CSynchronizator* CSynchronizator::NewLC()
    {
    CSynchronizator* self = new( ELeave ) CSynchronizator();
    CleanupStack::PushL( self );
    self->ConstructL();
    return self;
    }

CSynchronizator::CSynchronizator() : CActive( EPriorityStandard ) 
    {
    CActiveScheduler::Add( this );
    }

CSynchronizator::~CSynchronizator()
    {
    delete iPetlaZarzAkt;
    }

void CSynchronizator::ConstructL()
    {
    iPetlaZarzAkt = new( ELeave ) CActiveSchedulerWait();
    }

void CSynchronizator::Czekaj()
    {
    // Pole CActive::iStatus zostao przekazane do zewntrznej (poza klas) metody
    // asynchronicznej, wic ustawiamy obiekt w stan aktywny i zagniedamy
          // ptl Zarzdcy Aktywnoci. Ptla zostanie przerwana, gdy zewntrzna usuga
    // asynchroniczna zostanie skompletowana (wywoana zostanie wwczas metoda
    // CActiveSchedulerWait::AsyncStop()).
    SetActive();
    iPetlaZarzAkt->Start();
    }

void CSynchronizator::DoCancel()
    {
    }

void CSynchronizator::RunL()
    {
    iPetlaZarzAkt->AsyncStop();
    }
