posta - Amiga Magazine Online
posta - Amiga Magazine Online posta - Amiga Magazine Online
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
- Page 2 and 3: l con una videocassetta che ha tutt
- Page 5 and 6: P O S T A I Lettori ci Scrivono 6 S
- Page 7 and 8: ga 500 con 1,5 Mb di RAM e il mio p
- Page 9 and 10: nella gestione dei testi. E' una co
- Page 11 and 12: stato i diritti dell'HAM-E per migl
- Page 13 and 14: del brush secondo linee orizzontali
- Page 15 and 16: o più dischi interamente ci trovia
- Page 17: Un mondo uettoriale. Niente di spec
- Page 20 and 21: disorientato. Nello stesso modo son
- Page 22 and 23: espinto agli esami. Per orgoglio no
- Page 27 and 28: D' I tutte le applicazioni realizza
- Page 29 and 30: Q uasi tutti i nuovi programmi di g
- Page 31 and 32: On Disk 25 ILIVIIQA MAOAZINE ON DIS
- Page 33 and 34: Paolo Canali Guida tecnico-pratica
- Page 35 and 36: AT-BUS e XT-BUS Gli standard AT-BUS
- Page 37 and 38: l'"intelligenzan tipica delle perif
- Page 39 and 40: usare due trucchi: il primo è tene
- Page 41 and 42: HARD WARE In questo capitolo verrà
- Page 43 and 44: Capitolo 2: Hardware 3 SKIP Skip è
- Page 45 and 46: Ca~itolo 2: Hardware 5 I1 Blitter p
- Page 47 and 48: i-, L' ("i V l'-'l '.L/ I? Capitolo
- Page 49 and 50: La gestione del Timer su Amga Anton
- Page 51: Attese hardware Ci sono alcune appl
- Page 55 and 56: DOS 2.0 elenca una serie di pacchet
- Page 57 and 58: f~nestra CL1 scrivete: TArc/TArc a
- Page 59 and 60: U no dei campi in cui il software p
- Page 61 and 62: un errore o che tutti gli errori in
- Page 63 and 64: F in dall'uscita sul mercato di emu
- Page 65 and 66: IL SOFTWARE DI SETWP E DI GESTIONE
- Page 67 and 68: ggi le possibilità di scelta che s
- Page 69 and 70: problemi un A2091 della Commodore d
- Page 71 and 72: che gira perfettamente sul 3000) si
- Page 73 and 74: 17,. I I SET PN31 13) SELECT SET 15
- Page 75 and 76: vole interesse. Semplici modifiche
- Page 77 and 78: a GVP ha superato se stessa: quando
- Page 79 and 80: formare la song finale. Ogni evento
- Page 81 and 82: miga è sicuramente un com- puter i
- Page 83 and 84: Iprogrammatori di giochi preferi- s
- Page 85 and 86: Questo mese la consueta sono loro g
- Page 87: SIOA 1992 IO0 SALONE DELL'INFORMATI
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