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

#ifndef __TELINFO_H__
#define __TELINFO_H__

#include <e32base.h>        // CBase
#include <Etel3rdParty.h>   // CTelephony


class CSynchronizator;

class CTelInfo : public CBase
    {
public:        // Konstruktory dwufazowe i destruktor
    IMPORT_C static CTelInfo* NewL();
    IMPORT_C static CTelInfo* NewLC();
    IMPORT_C ~CTelInfo();

public:
    /**
    * Pobiera nazw producenta urzdzenia mobilnego.
    *
    * @param aProducent Deskryptor o dugoci 
    * CTelephony::KPhoneManufacturerIdSize
    *
    * @return Jeden ze zdefiniowanych kodw bdu
    */
    IMPORT_C TInt Producent( TDes& aProducent );
    
    /**
    * Pobiera model urzdzenia mobilnego.
    *
    * @param aModel Deskryptor modyfikowalny o dugoci
    * CTelephony::KPhoneModelIdSize
    *
    * @return Jeden ze zdefiniowanych kodw bdu
    */
    IMPORT_C TInt Model( TDes& aModel );

    /**
    * Pobiera numer seryjny urzdzenia mobilnego (IMEI).
    *
    * @param aImei Deskryptor modyfikowalny o dugoci
    * CTelephony::KPhoneSerialNumberSize
    *
    * @return Jeden ze zdefiniowanych kodw bdu
    */    
    IMPORT_C TInt Imei( TDes& aImei );
    
    /**
    * Pobiera numer seryjny karty SIM (IMSI).
    *
    * @param aImsi Deskryptor modyfikowalny o dugoci CTelephony::KIMSISize
    *
    * @return Jeden ze zdefiniowanych kodw bdu
    */    
    IMPORT_C TInt Imsi( TDes& aImsi );

private:    // Konstruktory pierwszej i drugiej fazy
    CTelInfo();
    void ConstructL();

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"


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

EXPORT_C CTelInfo* CTelInfo::NewLC()
    {
    CTelInfo* self = new( ELeave ) CTelInfo();
    CleanupStack::PushL( self );
    self->ConstructL();
    return self;
    }
    
CTelInfo::CTelInfo()
:iTelIdPckg( iTelId )
,iSimIdPckg( iSimId )
    {
    }

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

EXPORT_C 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;
    }

EXPORT_C 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;
    }

EXPORT_C 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;
    }
        
EXPORT_C 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;
    }
