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

#ifndef __KRYPTOGRAFIA_H__
#define __KRYPTOGRAFIA_H__

#include <e32base.h>

_LIT( KKryptoSerwerExe, "KryptoSerwer.exe" );

const TUint KLiczbaSlotowKomunikatow = 5;
const TUid KUid3KryptoSerwera = { 0xA0000099 };


class RKryptografia : public RSessionBase
    {
    public:        // Konstruktor domylny
        RKryptografia();

    public:        // Komunikacja z serwerem
        // Tworzenie sesji do serwera
        TInt Polacz();
        // Pobieranie najniszej wersji serwera, z ktrym kompatybilna jest 
// bieca wersja klasy RKryptografia.
        TVersion Wersja() const;

    public:        // Metody do szyfrowania/deszyfrowania danych
        // Szyfrowanie synchroniczne
        TInt Szyfruj( const TDesC8& aDaneDoSzyfrowania, TDes8& aDaneZaszyfrowane );
        // Szyfrowanie asynchroniczne
        void Szyfruj( const TDesC8& aDaneDoSzyfrowania, TDes8& aDaneZaszyfrowane, TRequestStatus& aStatus );
        void AnulujSzyfrowanie();
        // Deszyfrowanie synchroniczne
        TInt Deszyfruj( const TDesC8& aDaneZaszyfrowane, TDes8& aDaneOdszyfrowane );
        // Deszyfrowanie asynchroniczne
        void Deszyfruj( const TDesC8& aDaneZaszyfrowane, TDes8& aDaneOdszyfrowane, TRequestStatus& aStatus );
        void AnulujDeszyfrowanie();
    };

#endif // __KRYPTOGRAFIA_H__


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

#include <e32math.h>

#include "KryptoWspolne.h"
#include "Kryptografia.h"

static TInt StartSerwer();
static TInt UtworzProcesSerwera();


RKryptografia::RKryptografia()
: RSessionBase()
    {
    }

TInt RKryptografia::Polacz()
    {
    TInt blad = ::StartSerwer();

    if ( KErrNone == blad )
        {
        blad = CreateSession( KNazwaKryptoSerwera,
                              Wersja(),
                              KLiczbaSlotowKomunikatow );
        }
    return blad;
    }

TVersion RKryptografia::Wersja() const
    {
    return TVersion( KKryptoSerwerWersjaGlowna,
                     KKryptoSerwerWersjaPodrzedna,
                     KKryptoSerwerWersjaPlikuWyk );
    }

TInt RKryptografia::Szyfruj( const TDesC8& aDaneDoSzyfrowania, 
TDes8& aDaneZaszyfrowane )
    {
    TIpcArgs parametry( &aDaneDoSzyfrowania, &aDaneZaszyfrowane );
    return SendReceive( ESzyfrujSync, parametry );
    }

void RKryptografia::Szyfruj( const TDesC8& aDaneDoSzyfrowania, 
TDes8& aDaneZaszyfrowane, 
TRequestStatus& aStatus )
    {
    TIpcArgs parametry( &aDaneDoSzyfrowania, &aDaneZaszyfrowane );
    return SendReceive( ESzyfrujAsync, parametry, aStatus );
    }
    
void RKryptografia::AnulujSzyfrowanie()
    {
    Send( EAnulujSzyfrowanie );
    }
    
TInt RKryptografia::Deszyfruj( const TDesC8& aDaneZaszyfrowane, 
        TDes8& aDaneOdszyfrowane )
    {
    TIpcArgs parametry( &aDaneZaszyfrowane, &aDaneOdszyfrowane );
    return SendReceive( EDeszyfrujSync, parametry );
    }
    
void RKryptografia::Deszyfruj( const TDesC8& aDaneZaszyfrowane, 
                    TDes8& aDaneOdszyfrowane, 
                    TRequestStatus& aStatus )
    {
    TIpcArgs parametry( &aDaneZaszyfrowane, &aDaneOdszyfrowane );
    return SendReceive( EDeszyfrujAsync, parametry, aStatus );
    }

void RKryptografia::AnulujDeszyfrowanie()
    {
    Send( EAnulujSzyfrowanie );
    }
        
static TInt StartSerwer()
    {
    TInt blad = KErrNone;

    // Sprawdzamy, czy serwer jest uruchomiony.
    TFindServer znajdzSerwer( KNazwaKryptoSerwera );
    TFullName nazwa;

    blad = znajdzSerwer.Next( nazwa );
    if ( blad != KErrNone )
        {
        // Serwer nie jest uruchomiony.
        // 1. Tworzymy semafor.
        RSemaphore semafor;
        blad = semafor.CreateGlobal( KNazwaKryptoSemafora, 0 );
        if ( blad == KErrNone )
            {
            // 2. Tworzymy proces serwera.
            blad = UtworzProcesSerwera();
            
            if( blad == KErrNone )
                {
                // 3. Czekamy, a serwer si uruchomi. Jeeli tego nie
                // zrobimy, nie uda nam si utworzy sesji (metoda
                // CreateSession() zwrci bd KErrNotFound).
                semafor.Wait();
                }
            
            semafor.Close();
            }
        }

    return blad;
    }

static TInt UtworzProcesSerwera()
    {
    const TUidType uidKryptoSerwera( KNullUid, KNullUid, KUid3KryptoSerwera );

    // Tworzymy proces serwera.
    RProcess preocSerwera;
    TInt blad = preocSerwera.Create( KKryptoSerwerExe, KNullDesC, uidKryptoSerwera );

    if (  blad == KErrNone )
        {
        // Uruchamiamy proces serwera.
        preocSerwera.Resume();
        // Zamykamy uchwyt do procesu.
        preocSerwera.Close();
        }

    return  blad;
    }
