class CFirma : public CBase
{
    public:        // Konstruktor dwufazowy i destruktor
        static CFirma* NewLC();
        ~CFirma();
        
    public:        // Metody publiczne
        // Odczyt danych
        const TDesC& Nazwa() const { return *iNazwa; }
        TPtrC Nip() const { return *iNIP; }
        TPtrC Regon() const { return *iRegon; }
        // Kompletny adres: Nazwa firmy + ulica + miejscowo
        HBufC* AdresL() const;
        
        // Ustawianie danych
        void UstawNazweL( const TDesC& aNazwa );
        void UstawNipL( const TDesC& aNip );
        void UstawRegonL( const TDesC& aRegon );
        // Ulica + nr lokalu
        void UstawUliceL( const TDesC& aUlica );
        // Kod pocztowy + miejscowo
        void UstawMiejscowosc( const TDesC& aMiejscowosc );
        
        // Inne
        TDes& Notatka() { return iNotatka; }
        
    private:    // Konstruktory
        CFirma() {}
        void ConstructL();
        
    private:    // Pola
        HBufC* iNazwa;
        HBufC* iNIP;
        HBufC* iRegon;
        // Adres:
        // Ulica + nr lokalu
        HBufC* iUlica;
        // Kod pocztowy + miejscowo
        HBufC* iMiejscowosc;
        
        // Dane dodatkowe
        TBuf<128> iNotatka;
};

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

CFirma::~CFirma()
{
    delete iNazwa;
    delete iNIP;
    delete iRegon;
    delete iUlica;
    delete iMiejscowosc;    
}

void CFirma::ConstructL()
{
    // Inicjalizacja
    iNazwa = KNullDesC().AllocL();
    iNIP = KNullDesC().AllocL();
    iRegon = KNullDesC().AllocL();
    iUlica = KNullDesC().AllocL();
    iMiejscowosc = KNullDesC().AllocL();    
}

HBufC* CFirma::AdresL() const
{
    HBufC* adres = HBufC::NewL( iUlica->Length() + iMiejscowosc->Length() + 2 );
    TPtr adresWsk = adres->Des();
    
    _LIT( KNastepnaLinia, "\r\n" );
    
    adresWsk.Copy( *iUlica );
    adresWsk.Append( KNastepnaLinia );
    adresWsk.Append( *iMiejscowosc );
    
    return adres;
}

void CFirma::UstawNazweL( const TDesC& aNazwa )
{
    delete iNazwa;
    iNazwa = NULL;
    iNazwa = aNazwa.AllocL();
}

void CFirma::UstawNipL( const TDesC& aNip )
{
    delete iNIP;
    iNIP = NULL;
    iNIP = aNip.AllocL();
}

void CFirma::UstawRegonL( const TDesC& aRegon )
{
    delete iRegon;
    iRegon = NULL;
    iRegon = aRegon.AllocL();
}

void CFirma::UstawUliceL( const TDesC& aUlica )
{
    delete iUlica;
    iUlica = NULL;
    iUlica = aUlica.AllocL();
}

void CFirma::UstawMiejscowosc( const TDesC& aMiejscowosc )
{
    delete iMiejscowosc;
    iMiejscowosc = NULL;
    iMiejscowosc = aMiejscowosc.AllocL();
}
