/*
* TelInfo.inf
* Autor: Pawe Gala
*/

#ifndef __TELINFO_H__
#define __TELINFO_H__

#include <Etel3rdParty.h>    // CTelephony
#include "TelInfoInterfejs.h"


class CSynchronizator;

class CTelInfo : public CTelInfoInterfejs
    {
public:        // Konstruktor i destruktor
    CTelInfo();
    virtual ~CTelInfo();

public:        // Odziedziczone z CTelInfoInterfejs
    void ConstructL();
    TInt Producent( TDes& aProducent );
    TInt Model( TDes& aModel );
    TInt Imei( TDes& aImei );
    TInt Imsi( TDes& aImsi );

private:    // Pola
    CTelephony*    iTel;
    
    CTelephony::TPhoneIdV1 iTelId;
    CTelephony::TPhoneIdV1Pckg iTelIdPckg;
    
    CTelephony::TSubscriberIdV1 iSimId;
    CTelephony::TSubscriberIdV1Pckg iSimIdPckg;
    
    CSynchronizator* iSynchronizator;
    };

#endif  // __TELINFO_H__


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

#include "TelInfo.h"
#include "Synchronizator.h"

    
CTelInfo::CTelInfo()
:iTelIdPckg( iTelId )
,iSimIdPckg( iSimId )
    {
    }

CTelInfo::~CTelInfo()
    {
    delete iTel;
    delete iSynchronizator;
    }

void CTelInfo::ConstructL()
    {
    iTel = CTelephony::NewL();
    iSynchronizator = CSynchronizator::NewL();
    }

TInt CTelInfo::Producent( TDes& aProducent )
    {
    aProducent.Zero();
    TInt blad = KErrNone;
    
    // Sprawdzamy, czy metoda bya ju wczeniej wywoywana - dane zapamitane
          // bd w polu iTelId.
    if( iTelId.iManufacturer.Length() == 0 )
        {
        // Wywoujemy asynchroniczn metod CTelephony::GetPhoneId() i czekamy na jej
        // wykonanie.
        iTel->GetPhoneId( iSynchronizator->iStatus, iTelIdPckg );
        iSynchronizator->Czekaj();
        
        blad = iSynchronizator->iStatus.Int();
        }
    
    if( blad == KErrNone )
        {
        aProducent.Copy( iTelId.iManufacturer );
        }
    
    return blad;
    }

TInt CTelInfo::Model( TDes& aModel )
    {
    aModel.Zero();
    TInt blad = KErrNone;
    
    if( iTelId.iModel.Length() == 0 )
        {
        iTel->GetPhoneId( iSynchronizator->iStatus, iTelIdPckg );
        iSynchronizator->Czekaj();
        
        blad = iSynchronizator->iStatus.Int();
        }
    
    if( blad == KErrNone )
        {
        aModel.Copy( iTelId.iModel );
        }
    
    return blad;
    }

TInt CTelInfo::Imei( TDes& aImei )
    {
    aImei.Zero();
    TInt blad = KErrNone;
    
    if( iTelId.iSerialNumber.Length() == 0 )
        {
        iTel->GetPhoneId( iSynchronizator->iStatus, iTelIdPckg );
        iSynchronizator->Czekaj();
        
        blad = iSynchronizator->iStatus.Int();
        }
    
    if( blad == KErrNone )
        {
        aImei.Copy( iTelId.iSerialNumber );
        }
    
    return blad;
    }
        
TInt CTelInfo::Imsi( TDes& aImsi )
    {
    aImsi.Zero();
    TInt blad = KErrNone;

    // Sprawdzamy, czy metoda bya ju wczeniej wywoywana - dane zapamitane 
          // bd w polu iSimId.
    if( iSimId.iSubscriberId.Length() == 0 )
        {
        // Wywoujemy asynchroniczn metod CTelephony::GetSubscriberId() i czekamy na
        // jej wykonanie.
        iTel->GetSubscriberId( iSynchronizator->iStatus, iSimIdPckg );
        iSynchronizator->Czekaj();
        
        blad = iSynchronizator->iStatus.Int();
        }
    
    if( blad == KErrNone )
        {
        aImsi.Copy( iSimId.iSubscriberId );
        }
    
    return blad;
    }

/**
* Jedyna funkcja eksportowana z biblioteki polimorficznej. Posiada
* liczebnik porzdkowy (ang. ordinal) rwny 1 i suy do utworzenia
* obiektu klasy implementujcej interfejs CTelInfoInterfejs. 
*/
EXPORT_C CTelInfoInterfejs* NewL()
    {
    return new( ELeave ) CTelInfo();
    }
