posta - Amiga Magazine Online

posta - Amiga Magazine Online posta - Amiga Magazine Online

amigamagazine.info
from amigamagazine.info More from this publisher
16.06.2013 Views

Romano Tenca La notifica sotto 2.0 Una nuova importante caratteristica delllAmigaDOS. Fra le tante novità del DOS 2.0, particolare rilevanza merita I'implementazione del meccanismo della notifica, che consente un'integrazione più alta fra i programmi in multi- tasking e dunque una migliore interfaccia utente. La notifica permette a qualsiasi programma di ricevere un "awertimento" dal DOS quando un file o una directory vengono modificati dall'utente (mediante l'uso di un co- mando del DOS come delete, per esempio) o da un altro programma. Tale sistema, per esempio, è usato normalmente dal 2.0 per gestire le directory di preferences poste in ENV:; a questo modo tutte le volte che l'utente modifica le preferences il comando IPrefs (che viene eseguito di solito nella Startup- Sequence del 2.0) viene avvertito che qualcosa è stato modificato e si comporta di conseguenza. I vantaggi offerti dalla notifica sono molto importanti in un ambiente multitasking in cui certi dati vengano condivisi mediante file (d'ora in poi useremo genericamente la paro- la file per fare riferimento a un qualsiasi elemento del file system, anche se si tratta di directory); infatti, il programma che modifica un file non deve preoccuparsi di avvertire altri eventuali processi delle modifiche effettuate. Di questo compito si incarica direttamente il processo di gestione del file (I'handler), che conosce tutti i programmi interessati alla cosa. In altre parole, è l'oggetto che ha il compito di notificare a chiunque sia interessato che qualcu- no l'ha modificato. I pacchetti Perché la notifica possa awenire, il programma deve avan- zare una specifica richiesta in tal senso all'handler di gestio- ne del file (come RAM:, DFO:, HDO: ... ). La notifica è stata implementata sotto 2.0 mediante l'intro- duzione di due nuovi pacchetti per gli handler del DOS: ACTION-ADD-NOTIFY (4097), che richiede come primo argomento un BPTR alla struttura NotifyRequest (vedere figura 1) e restituisce un valore holeano come risultato, e ACTION-REMOVE-NOTIFY (4098), che ha lo stesso argo- mento e io stesso risultato. La struttura NotifyRequest permette di indicare il nome dell'elemento del file system da "sorvegliare" e il modo in cui deve awenire la notifica. I1 nome deve essere contenuto nella stringa (conclusa da uno 0) indirizzata dal campo nr-FullName. I1 nome deve struct NotifyRequest { UBYTE *nrName; /* usato per le funzioni */ UBYTE *nr-FullNarne; /* usato per i pacchetti */ ULONG nr-UserData; /* a disposizione delle applicazioni */ ULONG nr-Flags; union { struct 1 struct MsgPort *nr_Port; /* per SENDMESSAGE */ l nrMsg; struct { struct Task *nr-Task; /* per SEND-SIGNAL * / UBYTE nr-SignalNurn; /* per SEND-SIGNAL */ UBYTE nrgad[3] ; } nr-Signal; l nr-stuff; ULONG nr-Reserved [4] ; /* riservati: lasciare a O */ /* riservati al sistema */ ULONG nrMsgCount; /* numero di messaggi inviati */ struct MsgPort *nr-Handler; /* handler di gestione (usato da EndNotify) */ 1; Figura 1: La struttura NotifyRequest definita nel fde include do4notify.h

essere assoluto, cioè deve comprendere tutto il path a partire dalla radice del file system cui viene inviato (non sono ammesse le directory logiche, quelle generate con Assign). I1 motivo è molto semplice: si può chiedere la notifica anche di un file che ancora non esiste. Verremo awertiti quando il file sarà creato. Inoltre, la notifica conti- nua a sussistere anche quando il file viene cancellato. Non solo, ma potrebbe anche non esistere (o essere cancellata) la directory che contiene il file. Per questo, l'handler ha bisogno di conoscere tutto il path del file e non solo il nome relativo a una determinata directory come avviene di solito con altri pacchetti del DOS. I1 campo nr-UserData è a completa disposizione dell'appli- cativo, che lo può usare per tenerci dei dati o l'indirizzo di una funzione da lanciare nel momento in cui riceverà la notifica. I1 campo nr-Flags serve ad indicare all'handler quale meto- do deve utilizzare per effettuare la notifica. I flag possibili sono seguenti: NRF-SENDMESSAGE (1): richiede l'uso di un messaggio Exec come metodo di notifica. NRF-SEND-SIGNAL (2): richiede un semplice segnale Exec per la notifica. E' ovviamente alternativo al primo. NRF-WAIT-REPLY (8): ha significato in congiunzione con NRF-SENDMESSAGE; indica all'handler di attendere la replica al messaggio precedente prima di inviare un nuovo messaggio. NRF_NOTII;Y-INITIAL (16): indica all'handler di notifi- care il programma chiamante se il file esiste nel momento in cui si richiede la notifica (il che significa che la prima notifica ricevuta non segnala necessariamente una modifi- cazione del file, ma semplicemente la sua esistenza). L'interpretazione dell'union successiva dipende dal rneto- do prescelto per la notifica: se è stato scelto il metodo con i messaggi, allora nr-stuff.nr-Msg.nr-Port deve contenere l'indirizzo della MsgPort del programma chiamante cui l'handler invierà i messaggi. Se invece si sono preferiti i segnali, nr-stuff.nr-Signal.nrPTask dovrà contenere l'indi- rizzo della struttura Task del programma chiamante e nr-stuff.nr-Signal.SignaiNum il numero del segnale da usare. in pratica, ammesso che nr sia l'indirizzo della struttura NotifyRequest I'handler farà: PutMsg(nr->nr-stuff.nrMsg.nr-Port, messaggio) nel primo caso e: nel secondo. struct NotifyMessage { struct Message nm-ExecMessage; /* il solito messaggio Exec */ ULONG nmpClass; UWORD nm-Code; struct NotifyRequest *nm-NReq; /* non modificare */ ULONG nm-DoNotTouch; /* Riservato all'handler */ ULONG nm-DoNotTouch2; / * Riservato all' handler */ }; Figura 2: La struttura del messaggio inviato dali'handler: è definita nel file include dos/noti€y.h Il resto della struttura è riservato a sviluppi futuri, alle funzioni di gestione della notifica o all'handler. Se si sceglie il metodo dei messaggi, alla porta indicata arriveranno dei messaggi che corrispondono alla struttura NotifyMessage descritta in figura 2. I suoi campi hanno poca importanza e, fra l'altro, non sono molto documentati. Dopo la classica struttura Message di Exec compaiono due campi, il cui valore, impostato dall'handler, dovrebbe esse- re NOTIFY-CLASS (0x40000000) per nm-Class e NOTIFY-CODE (0x1234) per nm-Code. Non so a cosa facciano riferimento e i file include avvertono che il loro uso è scoraggiato e che potrebbero cambiare in futuro. Più utile è il campo nm-NReq che è un puntatore alla struttura NotifyRequest utilizzata per awiare la notifica. Gli altri campi sono riservati all'handler. Si ricordi che la memoria del messaggio è proprietà dell'handler e non sta al programma utente allocarla e disallocarla (come è invece il caso per NotifyRequest). Le funzioni Abbiamo visto finora il funzionamento della notifica a livello di pacchetti. Ma, come al solito, il DOS mette a disposizione delle funzioni per evitare di ricorrere diretta- mente ai pacchetti e aiutare il programmatore. Per awiare una notifica, si potrà usare la funzione StartNotify( ) che richiede come unico parametro una struttura NotifyRe- quest inizializzata e ritorna un valore booleano. Quando si usa questa funzione non si deve usare il campo nr-FullName, bensì nr-Name. In questo campo non andrà necessariamente il nome asso- luto del file che vogliamo monitorare, come in nr-FullName, ma potremo inserirvi anche nomi che con- tengono directory logiche e nomi relativi alla directory corrente del nostro processo; la funzione convertirà, per noi, tale nome in un nome assoluto e ne inserirà il valore in

essere assoluto, cioè deve comprendere tutto il path a<br />

partire dalla radice del file system cui viene inviato (non<br />

sono ammesse le directory logiche, quelle generate con<br />

Assign). I1 motivo è molto semplice: si può chiedere la<br />

notifica anche di un file che ancora non esiste. Verremo<br />

awertiti quando il file sarà creato. Inoltre, la notifica conti-<br />

nua a sussistere anche quando il file viene cancellato. Non<br />

solo, ma potrebbe anche non esistere (o essere cancellata)<br />

la directory che contiene il file. Per questo, l'handler ha<br />

bisogno di conoscere tutto il path del file e non solo il nome<br />

relativo a una determinata directory come avviene di solito<br />

con altri pacchetti del DOS.<br />

I1 campo nr-UserData è a completa disposizione dell'appli-<br />

cativo, che lo può usare per tenerci dei dati o l'indirizzo di<br />

una funzione da lanciare nel momento in cui riceverà la<br />

notifica.<br />

I1 campo nr-Flags serve ad indicare all'handler quale meto-<br />

do deve utilizzare per effettuare la notifica. I flag possibili<br />

sono seguenti:<br />

NRF-SENDMESSAGE (1): richiede l'uso di un messaggio<br />

Exec come metodo di notifica.<br />

NRF-SEND-SIGNAL (2): richiede un semplice segnale<br />

Exec per la notifica. E' ovviamente alternativo al primo.<br />

NRF-WAIT-REPLY (8): ha significato in congiunzione<br />

con NRF-SENDMESSAGE; indica all'handler di attendere<br />

la replica al messaggio precedente prima di inviare un<br />

nuovo messaggio.<br />

NRF_NOTII;Y-INITIAL (16): indica all'handler di notifi-<br />

care il programma chiamante se il file esiste nel momento<br />

in cui si richiede la notifica (il che significa che la prima<br />

notifica ricevuta non segnala necessariamente una modifi-<br />

cazione del file, ma semplicemente la sua esistenza).<br />

L'interpretazione dell'union successiva dipende dal rneto-<br />

do prescelto per la notifica: se è stato scelto il metodo con<br />

i messaggi, allora nr-stuff.nr-Msg.nr-Port deve contenere<br />

l'indirizzo della MsgPort del programma chiamante cui<br />

l'handler invierà i messaggi. Se invece si sono preferiti i<br />

segnali, nr-stuff.nr-Signal.nrPTask dovrà contenere l'indi-<br />

rizzo della struttura Task del programma chiamante e<br />

nr-stuff.nr-Signal.SignaiNum il numero del segnale da<br />

usare. in pratica, ammesso che nr sia l'indirizzo della<br />

struttura NotifyRequest I'handler farà:<br />

PutMsg(nr->nr-stuff.nrMsg.nr-Port, messaggio)<br />

nel primo caso e:<br />

nel secondo.<br />

struct NotifyMessage {<br />

struct Message nm-ExecMessage; /* il solito<br />

messaggio Exec */<br />

ULONG nmpClass;<br />

UWORD nm-Code;<br />

struct NotifyRequest *nm-NReq; /* non<br />

modificare */<br />

ULONG nm-DoNotTouch; /* Riservato<br />

all'handler */<br />

ULONG nm-DoNotTouch2; / * Riservato<br />

all' handler */<br />

};<br />

Figura 2: La struttura del messaggio inviato<br />

dali'handler: è definita nel file include dos/noti€y.h<br />

Il resto della struttura è riservato a sviluppi futuri, alle<br />

funzioni di gestione della notifica o all'handler.<br />

Se si sceglie il metodo dei messaggi, alla porta indicata<br />

arriveranno dei messaggi che corrispondono alla struttura<br />

NotifyMessage descritta in figura 2. I suoi campi hanno<br />

poca importanza e, fra l'altro, non sono molto documentati.<br />

Dopo la classica struttura Message di Exec compaiono due<br />

campi, il cui valore, im<strong>posta</strong>to dall'handler, dovrebbe esse-<br />

re NOTIFY-CLASS (0x40000000) per nm-Class e<br />

NOTIFY-CODE (0x1234) per nm-Code.<br />

Non so a cosa facciano riferimento e i file include avvertono<br />

che il loro uso è scoraggiato e che potrebbero cambiare in<br />

futuro. Più utile è il campo nm-NReq che è un puntatore<br />

alla struttura NotifyRequest utilizzata per awiare la notifica.<br />

Gli altri campi sono riservati all'handler. Si ricordi che la<br />

memoria del messaggio è proprietà dell'handler e non sta<br />

al programma utente allocarla e disallocarla (come è invece<br />

il caso per NotifyRequest).<br />

Le funzioni<br />

Abbiamo visto finora il funzionamento della notifica a<br />

livello di pacchetti. Ma, come al solito, il DOS mette a<br />

disposizione delle funzioni per evitare di ricorrere diretta-<br />

mente ai pacchetti e aiutare il programmatore. Per awiare<br />

una notifica, si potrà usare la funzione StartNotify( ) che<br />

richiede come unico parametro una struttura NotifyRe-<br />

quest inizializzata e ritorna un valore booleano. Quando si<br />

usa questa funzione non si deve usare il campo<br />

nr-FullName, bensì nr-Name.<br />

In questo campo non andrà necessariamente il nome asso-<br />

luto del file che vogliamo monitorare, come in<br />

nr-FullName, ma potremo inserirvi anche nomi che con-<br />

tengono directory logiche e nomi relativi alla directory<br />

corrente del nostro processo; la funzione convertirà, per<br />

noi, tale nome in un nome assoluto e ne inserirà il valore in

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!