home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* SPOOLER.PAS *)
- (* Drucker-Spooler für Turbo-Vision *)
- (* (c) 1993 Jochen Schäfer & DMV-Verlag *)
- (* ------------------------------------------------------ *)
- {$A+,B-,D+,E+,F-,G-,I+,K-,L+,N-,O-,P-,Q-,R-,S+,T-,V+,W-,X+}
- {$M 16384,0,655360}
-
- UNIT Spooler;
-
- INTERFACE
-
- USES Objects;
-
- CONST
- spNotFound = 2;
-
- TYPE
- pSpoolerCollection = ^tSpoolerCollection;
- tSpoolerCollection = OBJECT (tCollection)
- PROCEDURE FreeItem(Item : Pointer); VIRTUAL;
- END;
-
- pSpooler = ^tSpooler;
- tSpooler = OBJECT (tObject)
- CONSTRUCTOR Init(Entries : INTEGER; FileName : STRING);
- DESTRUCTOR Done; VIRTUAL;
- PROCEDURE Update; VIRTUAL;
- PROCEDURE Insert(FileName : pString); VIRTUAL;
- PROCEDURE Delete(FileName : pString); VIRTUAL;
- PROCEDURE Stop; VIRTUAL;
- PROCEDURE Go; VIRTUAL;
- PROCEDURE Error(Code, Info : INTEGER); VIRTUAL;
- PROCEDURE GetItems(VAR List : pItemList); VIRTUAL;
- FUNCTION Count : INTEGER;
- PRIVATE
- aList : pSpoolerCollection;
- Stop_Spooler, Wait : BOOLEAN;
- FUNCTION Find(FileName : pString) : INTEGER; VIRTUAL;
- END;
-
- IMPLEMENTATION
-
- USES Dos;
-
- VAR
- aFile, Printer : Text;
- Dummy : pString;
- ch : CHAR;
-
- PROCEDURE tSpoolerCollection.FreeItem(Item : Pointer);
- BEGIN
- IF Item <> NIL THEN Dispose(pString(Item));
- END;
-
- CONSTRUCTOR tSpooler.Init(Entries : INTEGER;
- FileName : STRING);
- (* Objekt, Dateien, Drucker, und Liste initialisieren *)
- BEGIN
- tObject.init;
- aList := New(pSpoolerCollection, Init(Entries, 1));
- Stop_Spooler := FALSE;
- Wait := FALSE;
- Assign(aFile, '');
- Assign(Printer, FileName);
- Rewrite(Printer);
- END;
-
- DESTRUCTOR tSpooler.Done;
- (* Dateien und Drucker schließen *)
- BEGIN
- IF TextRec(aFile).Mode <> fmClosed THEN Close(aFile);
- Close(Printer);
- tObject.Done;
- END;
-
- PROCEDURE tSpooler.Update;
- BEGIN
- IF TextRec(aFile).Mode = fmClosed THEN BEGIN
- (* Wenn aFile fertiggedruckt ist, neue Datei öffnen *)
- Dummy := aList^.at(0);
- IF Dummy <> NIL THEN BEGIN
- Assign(aFile, Dummy^);
- Reset(aFile);
- END;
- END;
- IF NOT Stop_Spooler THEN
- (* Wenn aktiv, nächstes Zeichen lesen und drucken *)
- IF NOT EoF(aFile) THEN BEGIN
- IF NOT Wait THEN
- Read(aFile, ch);
- {$I- }
- Write(Printer, ch);
- {$I+}
- Wait := (IoResult <> 0);
- (* Überprüfung, ob Drucker aktiv *)
- END ELSE BEGIN
- (* Wenn EoF, Datei schließen, FormFeed und Filename *)
- (* aus Liste löschen *)
- Close(aFile);
- Write(Printer, #12);
- Delete(Dummy);
- END;
- END;
-
- PROCEDURE tSpooler.Insert(FileName : pString);
- (* Filename in Liste einfügen *)
- BEGIN
- aList^.Insert(FileName);
- END;
-
- FUNCTION tSpooler.Find(FileName : pString) : INTEGER;
- (* Finde zutreffenden Namen in Liste *)
- VAR
- i : INTEGER;
- BEGIN
- Find := -1;
- FOR i := 0 TO aList^.Count-1 DO
- IF pString(aList^.At(i))^ = FileName^ THEN
- Find := i;
- END;
-
- PROCEDURE tSpooler.Delete(FileName : pString);
- (* Filename aus Liste löschen *)
- VAR
- Dummy : INTEGER;
- BEGIN
- Dummy := Find(FileName);
- IF Dummy = -1 THEN
- tSpooler.Error(spNotFound, 0)
- ELSE BEGIN
- IF (Dummy = 0) AND
- (TextRec(aFile).Mode <> fmClosed) THEN
- Close(aFile);
- aList^.Free(aList^.At(Dummy));
- END;
- END;
-
- PROCEDURE tSpooler.Stop;
- (* Spooler deaktivieren *)
- BEGIN
- Stop_Spooler := TRUE;
- END;
-
- PROCEDURE tSpooler.Go;
- (* Spooler aktivieren *)
- BEGIN
- Stop_Spooler := FALSE;
- END;
-
- PROCEDURE tSpooler.Error(Code, Info : INTEGER);
- (* Bei Fehler Programm anhalten *)
- BEGIN
- WriteLn('Runtime-Error ', Code:4, Info:4);
- Halt(Code);
- END;
-
- PROCEDURE tSpooler.GetItems(VAR List : pItemList);
- BEGIN
- List := aList^.Items;
- END;
-
- FUNCTION tSpooler.Count : INTEGER;
- BEGIN
- Count := aList^.Count;
- END;
-
- END.
- (* ------------------------------------------------------ *)
- (* Ende von SPOOLER.PAS *)
-
-