CLB_Ezechiele_net -
la gestione delle sessioni
nell’articolo precedente sono stati introdotti i concetti alla base dell’assembly CLB_Ezechiele_net, ed abbiamo iniziato una descrizione della Classe Clb. La classe Clb è banalmente l’interfaccia basica fra le classi che ora descriveremo e le funzionalità offerte dalle dll di Colibrì.
In questo articolo presenteremo in dettaglio la classi Session ed un insieme di altre, che possiamo definire helper, che hanno lo scopo di semplificare lo sviluppo del software di variantatura di Ezechiele.
Table of Contents
Gestione delle sessioni
Abbiamo affermato che una sessione è una connessione che permette di accedere da un client remoto alle funzionalità di Colibri per:
- Aprire immagini
- cartelle colori
- varianti colore
- selezionare ricette colore..
- ..ecc.
Tutti gli oggetti dei quali si ottiene la disposizione, sono remoti, non disponibili al client se non attraverso comandi di manipolazione. I comandi sono stati introdotti nell’articolo precedente, ed uno successivo li descriverà in dettaglio.
Possiamo definire i comandi come metodi per accedere alle informazioni degli oggetti remoti.
Il processo di connessione fa uso principalmente di due classi: Session e Sender
Session gestisce logicamente tutti gli oggetti remoti dei quali si è ottenuta disponibilità.
Sender gestisce il trasferimento dei comandi e degli argomenti al contesto remoto (Ezc_context) e ne riceve le risposte.
Lo schema che segue definisce il flusso delle informazioni fra le classi , fino a Colibri e ritorno (linee rosse e blue)
Aprire una sessione
Una sessione è aperta automaticamente allocando un’stanza Session e richiamando la sua funzione Session.open_connection :
Session conn = null;
conn = new Session();
if (conn.open_connection())
{
......
......
......
L’apertura della connessione genera un link interno fra la sessione aperta ed una sessione gemella remota in CLB_Ezechiele (una classe Ezc_context) il cui id è automaticamente memorizzato in Session.
Aperta la connessione sarà possibile effettuare tutte le richieste previste attraverso i comandi messi a disposizione da Clb_Ezechiele (li esporremo in una lista separata).
L’applicativo Ezechiele di Bottinelli terrà traccia delle sessioni e dei client ad esse connessi
Chiudere una sessione
La chiusura di una sessione è effettuata attraverso un frammento di codice del tipo seguente:
.......
........
conn.close();
........
........
l’istruzione conn.close() automaticamente informa CLB_Ezechiele che tutti gli oggetti messi a disposizione della Session dovranno essere rilasciati.
Sarà compito dell’applicativo Ezechiele decidere quando e se distruggere l’istanza conn disconnessa. Non si procede alla distruzione di conn fino a quando i riferimenti all’istanza non siano rimossi dall’applicazione
Interagire con una Sessione
Alla sessione potranno essere richiesti alcuni servizi, ad esempio recuperare un atlante colore, gestire un’immagine tif, psd o aprire un processo di variantatura dell’immagine, agire sui canali colore, ottenere una ricetta colore, aprire un profilo ecc..
Tutte le richieste saranno effettuate attraverso Comandi, gestiti dalle sessioni. Possiamo definire il comando come un’istruzione che ha per argomento i parametri associati..
Per definire la stringa di comando si utilizzano un insieme di parole chiave che consisto in verbi (azioni) e descrittori di oggetti.
ad esempio:
< get color_book > indica la richiesta di un atlante colore.
< open image > è la richiesta di apertura di un’immagine in una sessione
< get image area > richiede il trasferimento di un’area dell’immagine aperta nella sessione
tutte queste istruzioni sono seguite da argomenti del tipo opportuno e specificate nella documentazione.
get , color_book, open, image, area sono membri del vocabolario, parole chiave utilizzabili in contesti diversi.
Un comando è, come abbiamo riferito nell’articolo precedente, una stringa che definisce l’operazione richiesta ed un insieme di eventuali argomenti.
Possiamo definire il comando come un’istruzione che ha per argomento i parametri associati..
Analizziamo ad esempio il frammento di codice che segue:
/** @brief assegna un percorso sul server dove ricercare/salvare gli oggetti
* @obj_id stringa che definisce l'oggetto, ad esempio "color_book"..
* @return true se ok
*/
public bool set_obj_path(string obj_id, string path)
{
string cmd = "set path " + obj_id;
return send_cmd(_s(cmd), _s(path));
}
il commento interno al codice descrive l’uso della funzione; noi ci soffermiamo sulle istruzioni che formano il comando e sul modo di trasmissione dello stesso a Clb_Ezechiele .
La funzione appartiene alla classe Session: la stringa di comando < set pat > viene associata all’argomento passato alla funzione obj_id, che identifica una tipologia di oggetto (una delle parole chiave che definiscono gli oggetti gestiti..). Se ad esempio obj_id == “color_book” , la funzione di servizio Session.send_cmd(..) manderà il comando <set path color_book> , passando come unico argomento la stringa path
Per inciso, l’uso della funzione serve ad indicare a Ezc_context dove leggere e scrivere gli oggetti richiesti o salvati dall’azione del Client. Le successive richieste, ad esempio <open_color_book> non dovranno più informare del path completo di ricerca, ma solo del nome dell’atlante..
Approfitteremo dell’esempio appena fatto per esporre l’uso della funzione Session.Send_cmd
Formattare un comando e trasferirlo dalla sessione a Colibrì..
La funzione Session.send_cmd ha il compito di formattare il comando ed i suoi argomenti per trasferirlo in forma intellegibile alla classe Ezc_context connessa.
public bool send_cmd(params arg[] list)
{
if (id > 0)
{
Sender send = new Sender(id);
return send.push(list);
}
return false;
}
la funzione riceve sempre una lista di parametri di tipo variadic, essendo variabile il numero di argomenti trattati,
La funzione per prima cosa controlla la validità dell’id di Ezc_context associato, quindi passa la lista degli argomenti ad una classe Sender, specializzata nella formattazione e trasferimento del comando a CLB_Ezechiele.
Notare che la classe Sender istanziata è inizializzata con il valore dell’id di contesto gestito (vedi la funzione Session_open_connection()).
In questo articolo abbiamo descritto alcune funzioni della classe Session, in particolare le modalità di creazione dei comandi mandati a Colibri.
Session è una classe che può essere implementata attraverso nuovi comandi, tutti nella forma descritta in questo testo. Ad esempio potremo aggiungere nuove funzioni di interfaccia con Colibri, o derivare da essa classi che ne ereditano le funzionalità di base.
Abbiamo introdotto la classe Sender, che formmatta i messaggi e li trasferisce effettivamente utilizzando le funzioni di Clb.
nel prossimo articolo esporremo quindi le funzionalità della classe Sender e le modalità di codifica dei messaggi mandati a Colibri.