l'Interfaccia OPERATION_CALL di PRINTER_OUTPUT

Per comprendere come è definita la comunicazione fra il thread di stampa e un documento PRINTER_OUTPUT, ricordiamo che deriva dalla classe DOCUMENT dalla quale eredita l’interfaccia OPERATION_CALL. Quindi, come già descritto in questo blog il costruttore di PRINTER_OUTPUT conterrà la dichiarazione della funzione di interfaccia nel blocco __declare_slots di inizializzazione, di seguito integralmente riportato

___declare_slots
    { OP_FILTER, PRINTER_INTERFACE},
__end__declare_slots

PRINTER_OUTPUT::PRINTER_OUTPUT(void)
{
	INIT_OBJ
	ACTIVATE_OBJECT_SLOTS
}

Abbiamo evidenziato due righe nel frammento di codice: la prima dichiara uno slot PRINTER_INTERFACE che riceve i messaggi di codice OP_FILTER; la seconda linea, dichiarata nel costruttore di qualunque classe con interfaccia OPERATION_CALL, è una macro che registra gli slots definiti nel blocco __declare_slots..__end_declare_slots (in questo caso solo PRINTER_INTERFACE)

Riportiamo di seguito il codice relativo allo slot che intercetta i messaggi mandati dal thread di stampa:

__slot(PRINTER_INTERFACE)
	
	if (__function_is(L"GET_SEPLINES")) {
		int y=*A_INT(0);
		if (y>=0 && y<STR->info.area.dy) {
			if (GET_SEPARATIONS_LINE(STR,y)) 
				_A(3)=STR->sep;
		}
	}
	else
	if (__function_is(L"PREPARE_PRINTING")) {

		ALLOC_MEM		// alloca la memoria necessaria per le separazioni
		int dx=*A_INT(1);
		int dy=*A_INT(2);
	}
	else
	// la stampa è stata chiusa, liberare la memoria..
	if (__function_is(L"END_PRINTING")) {

		FREE_MEM	

		int dx=*A_INT(1);
		int dy=*A_INT(2);
		Clock *t=(Clock *)_A(3);
	}
__end_slot

La macro __function_is effettua un test sul comando ricevuto ed eventualmente lo esegue; Il thread di stampa spedisce un insieme di comandi:PREPARE_PRINTING: comunica al documento che è pronto per iniziare la stampa

PREPARE_PRINTING: comunica al documento che è pronto per iniziare la stampa. In risposta il documento alloca la memoria necessari (ALLOC_MEM). il thread ha rimandato anche alcuni  parametri, quali le dimensioni in pixel della pagina in stampa che ospiterà il documento. Li abbiamo estratti  ma non li abbiamo usati perchè non necessari all’uso interno alla classe

GET_SEPLINES: Richiede al documento la produzione delle linee delle separazioni, una per ciascun inchiostro definito nel profilo della stampante.

if (__function_is(L"GET_SEPLINES")) {
		int y=*A_INT(0);
		if (y>=0 && y<STR->info.area.dy) {
			if (GET_SEPARATIONS_LINE(STR,y)) 
				_A(3)=STR->sep;
		}
	}

Senza entrare in particolari inutili al contesto descritto, osserviamo che in risposta al comando GET_SEPLINES, viene estratto il numero di linea raster richiesto, quindi una volta testato che la linea appartiene all’intervallo del documento, richiama una funzione definita nel modulo (GET_SEPARATIONS_LINE) e, se l’operazione è riuscita, trasmette nello stack dei parametri il puntatore alla variabile STR->sep, cioè il vettore delle linee di pixel delle separazioni. La struttura STR->sep è proprio quella che deve essere ritornata al thread per la stampa della linea dell’oggetto. fra poco la descriveremo in dettaglio, poichè sarà identica a quella che dovrà essere rimandata da qualunque documento stampabile, indipendentemente dal modo di produzione interno alla classe.

END_PRINTING: Con questo comando il thread comunica alla classe documento che  ha terminato la stampa; in risposta il documento in questo caso libera la memoria allocata per il processo. Come al solito il thread manda alcune altre informazioni, non strettamente necessarie all’esecuzione del comando. In questo caso la classe estrae le dimensioni dell’area stampata e un’istanza della classe orologio che può essere usata per ricavare informazioni sui tempi di stampa (ma non ne faremo alcun uso in questo caso..)

Pages: 1 2 3 4
Skip to toolbar